[BZOJ2568]比特集合

这道题的思路还是比较好想的喵~

首先令数组 C[k][num] 表示 2 进制最后 k 位 <=num 的数的个数

查询第 k 位为 1 即询问 C[k][(1<<k+1)-1]-C[k][(1<<k)-1] 的值

因为要支持插入、删除,C 数组应使用树状数组或线段树来维护

然后可以用类似于标记永久化的方法,把 ADD 操作搞掉喵~

但是细节部分处理起来就比较麻烦了,WA 了好多次莫名其妙的 A 了

我也不敢写太多……

 1 #include <cstdio>
 2 #include <map>
 3
 4 namespace IOspace
 5 {
 6     inline char getch()
 7     {
 8         register char ch;
 9         do ch=getchar(); while (ch!=‘A‘ && ch!=‘I‘ && ch!=‘D‘ && ch!=‘Q‘);
10         return ch;
11     }
12     inline int getint()
13     {
14         register int num=0;
15         register char ch;
16         do ch=getchar(); while (ch<‘0‘ || ch>‘9‘);
17         do num=num*10+ch-‘0‘, ch=getchar(); while (ch>=‘0‘ && ch<=‘9‘);
18         return num;
19     }
20     inline void putint(int num, char ch=‘\n‘)
21     {
22         char stack[15];
23         register int top=0;
24         if (num==0) stack[top=1]=‘0‘;
25         for ( ;num;num/=10) stack[++top]=num%10+‘0‘;
26         for ( ;top;top--) putchar(stack[top]);
27         if (ch) putchar(ch);
28     }
29 }
30
31 int N;
32 int add;
33 std::map<int, int> s;
34 int sum[17][65537];
35 inline int lim(int x) {return (1<<x+1)-1;}
36 inline int min(int x, int y) {return x<y?x:y;}
37 inline int max(int x, int y) {return x>y?x:y;}
38 inline int lowbit(int x) {return x & -x;}
39 inline void update(int, int, int);
40 inline int query(int, int);
41
42 int main()
43 {
44     N=IOspace::getint();
45     for ( ;N;N--)
46     {
47         char ch=IOspace::getch(); int x=IOspace::getint();
48         if (ch==‘A‘) add+=x;
49         if (ch==‘I‘)
50         {
51             x-=add;
52             s[x]++;
53             for (int i=0;i<16;i++) update(i, (x & lim(i))+1, 1);
54         }
55         if (ch==‘D‘)
56         {
57             x-=add;
58             int t=s[x];
59             s[x]=0;
60             for (int i=0;i<16;i++) update(i, (x & lim(i))+1, -t);
61         }
62         if (ch==‘Q‘)
63         {
64             int l=1<<x, r=lim(x);
65             int ans=0;
66             ans+=query(x, min(max(r-(add & lim(x))+1, 0), 1<<16));
67             ans-=query(x, min(max(l-(add & lim(x)), 0), 1<<16));
68             l+=1<<x+1, r+=1<<x+1;
69             ans+=query(x, min(max(r-(add & lim(x))+1, 0), 1<<16));
70             ans-=query(x, min(max(l-(add & lim(x)), 0), 1<<16));
71             IOspace::putint(ans);
72         }
73     }
74
75     return 0;
76 }
77 inline void update(int k, int i, int v)
78 {
79     for ( ;i<=1<<16;i+=lowbit(i)) sum[k][i]+=v;
80 }
81 inline int query(int k, int i)
82 {
83     int ret=0;
84     for ( ;i;i-=lowbit(i)) ret+=sum[k][i];
85     return ret;
86 }

本傻也不知道自己在写什么的系列1

[BZOJ2568]比特集合

时间: 2024-11-05 00:12:24

[BZOJ2568]比特集合的相关文章

BZOJ 2568 比特集合

题目链接: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 . 思路:我看的这个 https://github.com/strongoier/OJ/tree

OpenGL和D3D11中的深度模版测试

    在OpenGL和D3D11的管线中,像素shader之后的操作就是深度模版测试,深度模版测试是以sample为单位进行的,就是一个像素上可以有多个采样点,每个采样点都有深度信息.深度模版测试对每个采样点都要进行一次,如果是msaa,最后要对每次采样的像素结果进行resolve,得到最终的结果.在下面的链接中有msaa的介绍. http://www.cnblogs.com/mikewolf2002/archive/2012/11/22/2783235.html     深度模版测试的流程如

系统分析师笔记--面向对象方法学

面向对象方法学 面向对象测试: 算法层:测试单个方法(成员函数).方法:等价类划分.组和功能测试.递归函数测试和多态消息测试. 类层:测试单个对象类.不变式边界测试.模态类测试.非模态类测试. 模板层:测试对象集成(一组协调工作的类的相互作用).多态服务测试和展平测试. 系统层:测试整个面向对象的系统. UML事物(元素) 1,结构事物.类.接口.协作.用例.活动类.构件.节点. 2,动作事物.交互.状态机. 3,分组事物.包. 4,注释事物. UML2.0 14种图: 1,类图.描叙一组类.接

UML建模快速入门02 UML介绍

2015/03/21 - 16:12 [声明]欢迎转载,但请保留文章原始出处:http://blog.csdn.net/yelangjueqi/article/details/44724765 1,UML概述 1.1,统一建模语言(Unified Modeling Language,UML)是一种绘制软件蓝图的标准语言.可以用uml对软件密集型系统的制品进行可视化.详述.构造和文档化. 1.2,要学习uml,一个有效的出发点是形成该语言的概念模型,这要求学习三个要素:uml的基本构造块, 支配这

python编程入门读书笔记2

数据结构 python中两大主力数据结构是列表和字典.列表按顺序存储数据,而字典像小型数据库,使用键高效的存储和检索数据. type函数可以检查值或变量的数据类型. 序列是一组按顺序排列的值,python中有3种内置的序列类型:字符串.元组和列表.第一个正索引为0,指向左端.第一个负索引为-1,指向右端.也可使用切片表示法复制子序列,例如s[begin:end]从索引begin复制到end-1的元素.可使用+和*进行拼接,要进行拼接序列的类型必须相同,不能元组和列表进行拼接.可使用len函数进行

UML的概念模型

为 了理解UML,需要形成该语言的概念模型,这要求学习建模的3个要素:UML的基本构造块.支配这些构造块如何放在一起的规则和一些运用于整个UML的公 共机制.如果掌握了这些思想,就能够读懂UML模型,并能建立一些基本模型.当有了较丰富的应用UML的经验时,就能够在这些概念模型之上使用更高深的语 言特征进行构造. 2.2.1 UML的构造块 UML的词汇表包含下面3种构造块: (1)事物 (2)关系 (3)图 事物是对模型中首要成分的抽象:关系把事物结合在一起:图聚集了相关的事物. 1. UML中

Java集合总览

这篇文章总结了所有的Java集合(Collection).主要介绍各个集合的特性和用途,以及在不同的集合类型之间转换的方式. Arrays Array是Java特有的数组.在你知道所要处理数据元素个数的情况下非常好用.java.util.Arrays 包含了许多处理数据的实用方法: Arrays.asList:可以从 Array 转换成 List.可以作为其他集合类型构造器的参数. Arrays.binarySearch:在一个已排序的或者其中一段中快速查找. Arrays.copyOf:如果你

Linux Android 多点触摸协议 原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/71/12306571.shtml

为了使用功能强大的多点触控设备.就须要一种方案去上报用户层所需的具体的手指触摸数据. 这个文档所描写叙述的多点触控协议能够让内核驱动程序向用户层上报随意多指的数据信息. 使用说明 单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCH.ABS_X.ABS_Y.SYNC.而多点触摸信息则是以ABS_MT承载并按一定顺序发送.如ABS_MT_POSITION_X.ABS_MT_POSITION_Y,然后通过调用input_mt_sync()产生一个 SYN_MT_REPORT event来

Java集合类型详解

这篇文章总结了所有的Java集合(Collection).主要介绍各个集合的特性和用途,以及在不同的集合类型之间转换的方式. Arrays Array是Java特有的数组.在你知道所要处理数据元素个数的情况下非常好用.java.util.Arrays 包含了许多处理数据的实用方法: Arrays.asList:可以从 Array 转换成 List.可以作为其他集合类型构造器的参数. Arrays.binarySearch:在一个已排序的或者其中一段中快速查找. Arrays.copyOf:如果你