题目链接:点这里!!!!
题意:有三个操作(n<=10000)。
1、add x往集合中加入x这个数
2、del x删除集合里的x
3、sum 集合的元素从小到大排序,a1<a2<a3<a4...<ak 求下标mod 5 = 3所有元素的和。
题解:
1、首先我们把所有数都离散,然后一一对应到线段树上,插入的话,直接插入到某个点上,删除也是如此。
2、这样子就相当于我们在线段树上求答案,然后就是简单的区间合并。但是要注意的一点是两两合并的时候记得加上后面的时候,记得把前面的个数加上取模,就可以了。 so easy!!!!
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<sstream> #include<algorithm> #include<vector> #include<bitset> #include<set> #include<queue> #include<stack> #include<map> #include<cstdlib> #include<cmath> #define PI 2*asin(1.0) #define LL long long #define pb push_back #define pa pair<int,int> #define clr(a,b) memset(a,b,sizeof(a)) #define lson lr<<1,l,mid #define rson lr<<1|1,mid+1,r #define bug(x) printf("%d++++++++++++++++++++%d\n",x,x) #define key_value ch[ch[root][1]][0]C:\Program Files\Git\bin const int MOD = 1E9+7; const LL N = 1E5+15; const int maxn = 1e4+1000; const int letter = 130; const int INF = 1e17; const double pi=acos(-1.0); const double eps=1e-8; using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,a[N]; LL ps[N<<2][5]; int sum[N<<2]; struct node{ int id,val; }que[N]; void pushup(int lr){ for(int i=0;i<5;i++) ps[lr][i]=ps[lr<<1][i]; for(int i=0;i<5;i++) ps[lr][(sum[lr<<1]+i)%5]+=ps[lr<<1|1][i]; } void build(int lr,int l,int r){ if(l>r) return; if(l==r){ sum[lr]=0; for(int i=0;i<5;i++) ps[lr][i]=0; return; } int mid=(l+r)>>1; build(lson); build(rson); pushup(lr); } void update(int w,int val,int lr,int l,int r){ sum[lr]+=val; if(l==r){ ps[lr][1]+=1ll*val*a[l]; return; } int mid=(l+r)>>1; if(w<=mid) update(w,val,lson); else update(w,val,rson); pushup(lr); } int main(){ char ch[10]; int x; scanf("%d",&n); int cnt=0; for(int i=1;i<=n;i++){ scanf("%s",ch); if(ch[0]=='a'){ scanf("%d",&x); que[i].id=1; a[++cnt]=que[i].val=x; } else if(ch[0]=='d'){ scanf("%d",&x); que[i].id=2; que[i].val=x; } else que[i].id=3; } ///sum 总和 sort(a+1,a+cnt+1); cnt=unique(a+1,a+cnt+1)-(a+1); for(int i=1;i<=n;i++) if(que[i].id!=3) que[i].val=lower_bound(a+1,a+cnt+1,que[i].val)-a; clr(sum,0); clr(ps,0); ///build(1,1,cnt); for(int i=1;i<=n;i++){ if(que[i].id==1) update(que[i].val,1,1,1,cnt); else if(que[i].id==2) update(que[i].val,-1,1,1,cnt); else printf("%I64d\n",ps[1][3]); } return 0; }