2012金華現場賽 E - IT Companies [HDU - 4446]
阿新 • • 發佈:2018-11-22
E - IT Companies [HDU - 4446]
題面
思路
考慮
的情況,必然它是目前序列裡最大的公司,否則在
中必然有
,因此只需將
放入維護的從大到小順序的答案佇列中,更新
中
的值
考慮
,說明最大值不在公司中,而在branch中,而在
的操作下,越先出現的branch其值一定越大,因此還需維護一個branch的從大到小順序的答案佇列,並跟新
的值
而出現
的情況或者在2條件下branch佇列為空即為不可能情況
當兩個佇列大小為2*n時結束
程式碼
const int maxn = 5e5+7;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int none = -1;
const LL linf = (LL)inf << 32 | inf;
int tree[maxn],num[maxn],lazy[maxn];
queue<int>ans,bran;
stack<int>stk;
void up(int rt){
if(tree[rt<<1]<=tree[rt<<1|1]){
tree[rt]=tree[rt<<1];
num[rt]=num[rt<<1];
} else{
tree[rt]=tree[rt<<1|1];
num[rt]=num[rt<<1|1];
}
}
void down(int rt){
if(lazy[rt]!=0){
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
tree[rt<<1]+=lazy[rt];
tree[rt<<1|1]+=lazy[rt];
}
lazy[rt]=0;
}
void build(int l,int r,int rt){
if(l==r){
rd(tree[rt]);
num[rt]=l;
return ;
}
__m;
build(lson);
build(rson);
up(rt);
}
void update(int l,int r,int rt,int L,int R,int add){
if(L>R)return;
if(l>=L&&r<=R){
tree[rt]+=add;
lazy[rt]+=add;
return ;
}
down(rt);
__m;
if(mid>=L)update(lson,L,R,add);
if(mid<R)update(rson,L,R,add);
up(rt);
}
int main(){
int n;
while(rd(n),n){
clr(lazy);
while(!ans.empty())ans.pop();
while(!bran.empty())bran.pop();
while(!stk.empty())stk.pop();
build(1,n,1);
bool ok=true;
while(ans.size()+bran.size()<2*n){
if(tree[1]==0){
ans.push(num[1]);
bran.push(-num[1]);
int now=num[1];
update(1,n,1,1,now-1,-1);
update(1,n,1,now,now,inf);
} else if(tree[1]>0){
if(bran.empty()){
ok=false;
break;
}
int now=bran.front();
bran.pop();
ans.push(now);
update(1,n,1,-now+1,n,-1);
} else {
ok=false;
break;
}
}
if(!ok){
puts("Impossible");
continue;
}
while(!ans.empty()){
stk.push(ans.front());
ans.pop();
}
while(!bran.empty()){
stk.push(bran.front());
bran.pop();
}
while(!stk.empty()){
printf("%d ",stk.top());stk.pop();
}
puts("");
}
}