CF 85D 综合练习1

Posted chinesepikaync

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF 85D 综合练习1相关的知识,希望对你有一定的参考价值。

题意:

一个集合,初始为空。现有三个操作:

  1. add:向集合里加入数x,保证加入前集合中没有数x;

  2. del:从集合中删除数x,保证删除前集合中有x;

  3. 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的主要内容,如果未能解决你的问题,请参考以下文章

CF 482B 综合练习2

第1章 综合练习

codeforces85D

shell综合练习题(图文并茂代码清单)

Python基础综合练习

SVM算法应用综合练习--人脸微笑识别