您的位置:首页 > 产品设计 > UI/UE

[平衡树 模拟] SnackDown 2017 Online Elimination Round #WIQ Waiting in a Queue

2017-06-06 15:11 429 查看
直接模拟下这个队列就好了

下一个处理的事件应该是第一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐