[平衡树 模拟] SnackDown 2017 Online Elimination Round #WIQ Waiting in a Queue
2017-06-06 15:11
429 查看
直接模拟下这个队列就好了
下一个处理的事件应该是第一个bi−i≤t−1的人
平衡树维护bi−i
下一个处理的事件应该是第一个bi−i≤t−1的人
平衡树维护bi−i
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #define cl(x) memset(x,0,sizeof(x)) using namespace std; typedef long long ll; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline void read(int &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } inline void read(ll &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } const int N=1000005; struct node{ node *l,*r; ll val,add,minv,fix; int size,idx; node(){ } node(ll v,int i){ val=minv=v; add=0; size=1; idx=i; fix=(ll)rand()*rand(); l=r=NULL; } void mark(ll x){ val+=x; minv+=x; add+=x; } void push(){ if (add){ if (l) l->mark(add); if (r) r->mark(add); add=0; } } void upd(){ minv=val; size=1; if (l) minv=min(minv,l->minv),size+=l->size; if (r) minv=min(minv,r->minv),size+=r->size; } }pool ,*rt; inline int Size(node *x){ return x?x->size:0; } inline ll Minv(node *x){ return x?x->minv:1LL<<60; } inline node* Merge(node *A,node *B){ if (!A || !B) return !A?B:A; A->push(); B->push(); if (A->fix<B->fix){ A->r=Merge(A->r,B); A->upd(); return A; }else{ B->l=Merge(A,B->l); B->upd(); return B; } } typedef pair<node*,node*> Droot; inline Droot Split(node *A,int K){ if (!A) return Droot(NULL,NULL); A->push(); if (K<=Size(A->l)){ Droot y=Split(A->l,K); A->l=y.second; A->upd(); y.second=A; return y; }else{ Droot y=Split(A->r,K-Size(A->l)-1); A->r=y.first; A->upd(); y.first=A; return y; } } inline int find(ll num){ node *p=rt; int ret=0; while (p){ p->push(); if (min(p->val,Minv(p->l))>num) ret+=Size(p->l)+1,p=p->r; else p=p->l; } return ret; } int n; ll a ,b ; ll ans ; int main(){ int T; freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(T); while (T--){ read(n); for (int i=1;i<=n;i++) read(a[i]); rt=NULL; for (int i=1;i<=n;i++){ read(b[i]); pool[i]=node(b[i]-i,i); rt=Merge(rt,pool+i); } ll t=1; for (int i=n;i;i--){ ll mv=rt->minv; if (mv>t-1) t+=(mv-(t-1)+i-1)/i*i; int k=find(t-1); Droot x=Split(rt,k); Droot y=Split(x.second,1); node *c=y.first; ans[c->idx]=t+k+a[c->idx]; t+=k+a[c->idx]+1; if (x.first) x.first->mark(-(i-k-1)); if (y.second) y.second->mark(k+1); rt=Merge(y.second,x.first); } for (int i=1;i<=n;i++) printf("%lld ",ans[i]); printf("\n"); //cl(pool); } return 0; }
相关文章推荐
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- SnackDown 2017 Online Elimination Round 记录 & 简要题解
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 【PAT1014】 Waiting in Line (30) queue模拟排队
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- SnackDown 2017 Online Elimination Round #Prefix Xor -- 主席树
- 8VC Venture Cup 2017 - Elimination Round B. PolandBall and Game【思维+模拟】
- Codeforces Round #380 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 2) D. Sea Battle 模拟
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- SnakeDown 2017 Online Pre-Elimination Round A D 结题报告:三分
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- SnackDown Online Qualifier 2017 | Snake Procession
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)