CF 85D 综合练习1
Posted chinesepikaync
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF 85D 综合练习1相关的知识,希望对你有一定的参考价值。
题意:
一个集合,初始为空。现有三个操作:
add:向集合里加入数x,保证加入前集合中没有数x;
del:从集合中删除数x,保证删除前集合中有x;
sum:询问将集合里的数从小到大排序后,求下标i模5余3的数的和。
现有n次操作,对于每个查询操作,输出答案
很显然,权值线段树,每个节点存 5 个数即可,分别是下标 (mod 5) 为 (0,1,2,3,4) 的数的个数
然后 pushup 的时候稍微改改即可
// This code writed by chtholly_micromaker(MicroMaker)
#include <bits/stdc++.h>
#define reg register
#define int long long
using namespace std;
const int MaxN=100050;
template <class t> inline void read(t &s)
{
s=0;
reg int f=1;
reg char c=getchar();
while(!isdigit(c))
{
if(c=='-')
f=-1;
c=getchar();
}
while(isdigit(c))
s=(s<<3)+(s<<1)+(c^48),c=getchar();
s*=f;
return;
}
#define lson ls[u]
#define rson rs[u]
int val[MaxN<<4][5];
int siz[MaxN<<4];
int ls[MaxN<<4],rs[MaxN<<4];
int n,cnt=1;
inline void pushup(int u)
{
siz[u]=siz[lson]+siz[rson];
for(int i=0;i<5;++i)
val[u][i]=val[lson][i]+val[rson][((i-siz[lson])%5+5)%5];
return;
}
inline void modify(int &u,int l,int r,int p,int k)
{
if(!u)
u=++cnt;
if(l==r)
{
val[u][1]+=p*k;
siz[u]+=k;
return;
}
reg int mid=(l+r)>>1;
if(p<=mid)
modify(lson,l,mid,p,k);
else
modify(rson,mid+1,r,p,k);
pushup(u);
return;
}
signed main(void)
{
char s[5];
cin>>n;gets(s);
reg int x,rt=1;
for(int i=1;i<=n;++i)
{
scanf("%s",s);
if(s[0]=='a')
{
read(x);
modify(rt,1,1e9+1,x,1);
}
else if(s[0]=='d')
{
read(x);
modify(rt,1,1e9+1,x,-1);
}
else
printf("%lld
",val[1][3]);
}
return 0;
}
以上是关于CF 85D 综合练习1的主要内容,如果未能解决你的问题,请参考以下文章