题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2568

题意:维护一个集合S,支持以下操作:

(1)INS M : 将元素 M 插入到集合S中;
(2)DEL M : 将集合S中所有等于 M 的元素删除;
(3)ADD M : 将集合S中的所有元素都增加数值M ;
(4)QBIT k : 查询集合中有多少个元素满足其二进制的第 k位为 1 。

思路:

(1) ADD 操作的那个和单独拿出来,设为sum,集合S中的每个元素x实际值为x+sum;

(2)设f[k][t]表示第k位为1,且这个数字小于等于t的数字的个数。每次查询时,设L=2^x,R=2^(x+1)-1,则答案为f[k][R]-f[k][L-1];

(3)由于增加一个数字时这个f值是成段改变,因此要用树状数组维护这个f数组;

(4)对于那些插入的数字都是多少以及每个数字有多少个,用一个map记录,这样删除时就知道在树状数组要减去多少。

我当时有个问题没有明白,因为插入x时实际要插入的数字是x-sum,那么x-sum为负数时这个位跟正数的位不太一样。负数的二进制表示是对应正数的二进制表示取反加1。

比如

-1=11111111 11111111  11111111 11111111

-2=11111111 11111111  11111111 11111110

-3=11111111 11111111  11111111 11111101

-4=11111111 11111111  11111111 11111100

直接插入(下面可以看到,不需要特殊考虑负数)

后面那还加了个1是因为树状数组里下标都是从1开始的。

然后求和时是这样的

这个分为两部分,第一部分:计算的是[L,R]区间,设k=2,那么二进制表示L=100,R=111。设sum=1011,那么实际要计算的区间为[001,100],只要一个数字的后三位在这个区间,即[001,100],那么它加上sum之后的后三位都会落到[L,R]区间。其实这个是没有进位的。

我们再设sum=1110,其他不变,那么上面的实际求和区间变成[000,001]。我们发现,除了这个区间,[110,111]这个区间也是可以的。这个其实是进位产生的,进位之后求和区间由[100,111]变为[1100,1111],这样减去sum的后三位110实际区间为[110,1001],我们发现1001,1000都不会有这个值,所以实际就是[110,111]。这就是上面求和的第二部分。

那么一个负数加上sum之后也可能到达这个区间,sum=1110,[-10,-7],这些负数的二进制为

-10=11111111 11111111  11111111 11110110

-9  =11111111 11111111  11111111 11110111

-8  =11111111 11111111  11111111 11111000

-7  =11111111 11111111  11111111 11111001

我们发现,后三位都在计算的两个区间里。所以负数不需要额外考虑。

int S[20][N];
map<int,int> mp; int n; void add(int k,int x,int t)
{
while(x<N) S[k][x]+=t,x+=x&-x;
} int get(int k,int x)
{
int ans=0;
while(x) ans+=S[k][x],x-=x&-x;
return ans;
} int main()
{ n=myInt(); int sum=0;
while(n--)
{
char op[10];
int x;
scanf("%s%d",op,&x);
if('A'==op[0]) sum+=x;
else if('I'==op[0])
{
x-=sum;
mp[x]++;
for(int i=0;i<16;i++) add(i,(x&((1<<(i+1))-1))+1,1);
}
else if('D'==op[0])
{
x-=sum;
int t=mp[x];
mp[x]=0;
for(int i=0;i<16;i++) add(i,(x&((1<<(i+1))-1))+1,-t);
}
else if('Q'==op[0])
{
int ans=0;
int L=1<<x,R=(1<<(x+1))-1;
ans+=get(x,min(1<<16,max(0,R-(sum&((1<<(x+1))-1))+1)));
ans-=get(x,min(1<<16,max(0,L-(sum&((1<<(x+1))-1)))));
L|=1<<(x+1);
R|=1<<(x+1);
ans+=get(x,min(1<<16,max(0,R-(sum&((1<<(x+1))-1))+1)));
ans-=get(x,min(1<<16,max(0,L-(sum&((1<<(x+1))-1)))));
printf("%d\n",ans);
}
}
}

  

BZOJ 2568 比特集合的更多相关文章

  1. BZOJ2568 [国家集训队2012]比特集合

    Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...

  2. bzoj2568 比特集合

    Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...

  3. B2568 比特集合 树状数组

    啊啊啊,跳题坑死人.抽了一道国集的题,自己瞎编了一个算法,好像过不了而半途而废.转去看题解,发现用二维树状数组维护一下,偏移量我倒是想对了,但是维护的东西和我的完全不一样.还是有很大差距啊... 题解 ...

  4. bzoj 2734: [HNOI2012]集合选数 状压DP

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 321[Submit][Status ...

  5. bzoj 2734: [HNOI2012]集合选数

    题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中. 同学们不喜 ...

  6. BZOJ2568 比特集合(树状数组)

    考虑维护f[k][x]表示“最低k位所表示的数不大于x”的数的个数.那么查询时答案就为f[k][2k-1]-f[k][2k-1-1]. 同时记录每个数在集合中出现多少次.这样的话插入.删除已经解决了, ...

  7. 【刷题】BZOJ 2734 [HNOI2012]集合选数

    Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...

  8. bzoj 2734 [HNOI2012]集合选数 状压DP+预处理

    这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #inclu ...

  9. bzoj:4762: 最小集合

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4762 mark一下,有空要好好弄懂 #include<cstdio> #inc ...

随机推荐

  1. 关于nandflash与norflash

    读取速度:nor > nand 写入速度:nand > nor 擦除速度:nand 4ms,nor 5s nand的擦除单元更小,相应的擦除电路更少. nand的实际应用方式比nor复杂, ...

  2. 【python cookbook】【字符串与文本】12.文本过滤和清理

    问题:例如清除在web页面表单中填入了pýtĥöñis这样的文本 解决方法:str.translate()方法 s = 'p\xfdt\u0125\xf6\xf1\x0cis\tawesome\r\n ...

  3. loadruner报错:Step download timeout(120 seconds)的一个解决方法

    一个网友问了我一个问题如下: loadruner报错:Error -27728: Step download timeout (120 seconds) 如何解决 语 法检查通过,但是在并发执行一个查 ...

  4. NIOS II开发备忘录

    大概有一年没做NIOS II的开发了,回想上一次做NIOS II还是去年做毕业设计的时候.那时候做的是基于SOPC的频率特性测试仪,我大约花了2个月的时间,从无到有的学习了NIOS II开发.学习过N ...

  5. Hive文件格式

    hive文件存储格式包括以下几类: 1.TEXTFILE 2.SEQUENCEFILE 3.RCFILE 4.ORCFILE(0.11以后出现) 其中TEXTFILE为默认格式,建表时不指定默认为这个 ...

  6. MongoDB Shell

    MongoDB Shell   1.连接指定主机及数据库 mongo 127.0.0.1:30000/myDB 链接到127.0.0.1的30000端口的myDB 2.启动后连接指定数据库 *.&qu ...

  7. greenplum如何激活,同步,删除standby和恢复原始master

    在Master失效时,同步程序会停止,Standby可以被在本机被激活,激活Standby时,同步日志被用来恢复Master最后一次事务成功提交时的状态.在激活Standby时还可以指定一个新的Sta ...

  8. java 面试每日一题7

    题目:判断101-200之间有多少个素数,并输出所有素数. 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数. public cla ...

  9. Android studio中设置颜色的状态选择器

    <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item andro ...

  10. CSS3前缀自动补全方案和插件

    第一种方法:prefix free,js插件,大小2kb,直接导入,无需任何浏览器兼容前缀 <script src="prefixfree.min.js"></s ...