题目:CF702F
不知道为什么,答案老是随机,但没调出来。
#include<bits/stdc++.h>
using namespace std;
mt19937 rd(time(0));
const int N=2e5+5;
int n,m,b[N],ans[N],tot,rt;
struct no{
int c,q;
}a[N];
bool cmp(no x,no y){
return x.q==y.q?x.c<y.c:x.q>y.q;
}
struct ab{
unsigned int pro;
int key,v,x,id,ans,l,r;
}tr[N];
int _new(int key,int id){
tr[++tot]={rd(),key,0,0,id,0,0,0};
return tot;
}
void pushdown(int p){
if(tr[p].v){
if(tr[p].l){
tr[tr[p].l].v+=tr[p].v;
tr[tr[p].l].ans+=tr[p].v;
}
if(tr[p].r){
tr[tr[p].r].v+=tr[p].v;
tr[tr[p].r].ans+=tr[p].v;
}
tr[p].v=0;
}
if(tr[p].x){
if(tr[p].l){
tr[tr[p].l].x+=tr[p].x;
tr[tr[p].l].key-=tr[p].x;
}
if(tr[p].r){
tr[tr[p].r].x+=tr[p].x;
tr[tr[p].r].key-=tr[p].x;
}
tr[p].x=0;
}
}
void split(int p,int k,int &l,int &r){
if(!p)l=r=0;
else{
pushdown(p);
if(tr[p].key<k){
l=p;
split(tr[p].r,k,tr[p].r,r);
}
else{
r=p;
split(tr[p].l,k,l,tr[p].l);
}
}
}
int merge(int l,int r){
if(!l||!r)return l|r;
if(tr[l].pro<=tr[r].pro){
pushdown(l);
tr[l].r=merge(tr[l].r,r);
return l;
}
pushdown(r);
tr[r].l=merge(l,tr[r].l);
return r;
}
void dfs(int u){
pushdown(u);
if(tr[u].l)dfs(tr[u].l);
if(tr[u].r)dfs(tr[u].r);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].c>>a[i].q;
sort(a+1,a+1+n,cmp);
cin>>m;
for(int i=1;i<=m;i++){
cin>>b[i];
rt=merge(rt,_new(b[i],i));
}
int p1,p2,p3,p4,p5,p6;
for(int i=1;i<=n;i++){
split(rt,2*a[i].c,p1,p2);
tr[p2].v++;
tr[p2].ans++;
tr[p2].x+=a[i].c;
tr[p2].key-=a[i].c;
split(p1,a[i].c,p3,p4);
while(p4){
tr[p4].key-=a[i].c;
tr[p4].ans++;
pushdown(p4);
int x=merge(tr[p4].l,tr[p4].r);
tr[p4].l=tr[p4].r=0;
split(p3,tr[p4].key,p5,p6);
p3=merge(merge(p5,p4),p6);
p4=x;
}
rt=merge(p3,p2);
}
dfs(rt);
for(int i=1;i<=tot;i++)ans[tr[i].id]=tr[i].ans;
for(int i=1;i<=m;i++)cout<<ans[i]<<" ";
return 0;
}