【codeforces85D】
去实验培训回来了……写个题先玩玩
这题给人一种平衡树的感觉
但是呢,实际上操作离线+离散化+线段树一样能做
#include<bits/stdc++.h> #define lson (o<<1) #define rson (o<<1|1) const int N=2e5+5; typedef long long ll; using namespace std; struct Opt{int tp,num;}op[N]; int n,a[N],cnt=0,tot=0; ll sumv[N<<2],modv[N<<2][5]; inline void pushup(int o){ sumv[o]=sumv[lson]+sumv[rson]; for(int i=0;i<=4;i++){ int x=(sumv[lson]+i)%5; modv[o][x]=modv[lson][x]+modv[rson][i]; } } inline void change(int o,int l,int r,int q,int v){ if(l==r){ sumv[o]+=v;modv[o][1]=v>0?a[q]:0; return; } int mid=(l+r)>>1; if(q<mid)change(lson,l,mid,q,v); else change(rson,mid+1,r,q,v); pushup(o); } inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } int main(){ n=read();char s[20]; for(int i=1;i<=n;i++){ scanf("%s",s); if(s[0]=='a'){op[i].tp=1;op[i].num=read();a[tot++]=op[i].num;} else if(s[0]=='d'){op[i].tp=2;a[tot++]=op[i].num=read();} else op[i].tp=3; } sort(a,a+tot);int len=unique(a,a+tot)-a; for(int i=1;i<=n;i++){ if(op[i].tp==1){ int p=lower_bound(a,a+len,op[i].num)-a; change(1,1,len+1,p,1); } else if(op[i].tp==2){ int p=lower_bound(a,a+len,op[i].num)-a; change(1,1,len+1,p,-1); } else printf("%I64d\n",modv[1][3]); } }
zzq wc-ctsc-apio-NOI Au;yql精通多项式;zyz精通女装;由乃精通数据结构;孔老师是毒奶大师;我没有学上:我们都有光明的前途。