送花[樹狀陣列+二分]
阿新 • • 發佈:2018-12-02
以c為下標插入樹狀陣列 , 然後二分求最大最小 , 按題目要求刪除,插入就好
#include<bits/stdc++.h> #define N 1000050 #define LL long long using namespace std; int c[N],w[N],tot; LL ans1,ans2; void Up(int x,int val){for(;x<=N-50;x+=x&-x)c[x]+=val;} int Q(int x){int ans=0; for(;x;x-=x&-x) ans+=c[x];return ans;} void Delete_max(){ int l=0,r=N; while(l<r){ int mid=(l+r)>>1; if(Q(mid)>=tot) r=mid; else l=mid+1; }Up(l,-1); } void Delete_min(){ int l=0,r=N; while(l<r){ int mid=(l+r+1)>>1; if(Q(mid)<=0) l=mid; else r=mid-1; }Up(l+1,-1); } int main(){ int op,x,y; while(1){ scanf("%d",&op); if(op==-1) break; if(op==1){ scanf("%d%d",&x,&y); if(Q(y)-Q(y-1)==1) continue; w[y]=x , Up(y,1) , tot++; } if(op==2 && Q(N-50)) Delete_max(),tot--; if(op==3 && Q(N-50)) Delete_min(),tot--; } for(int i=1;i<=N-50;i++) if(Q(i)-Q(i-1)==1) ans1+=(LL)w[i],ans2+=(LL)i; printf("%lld %lld",ans1,ans2); return 0; }