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

题解链接

吐槽一个事,谁能给我讲讲位运算的优先级?

#include<iostream>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstdlib>
#include<cstdio>
#include<map>
#include<bitset>
#include<set>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 1010
#define MAXM 1010
#define ll long long
#define eps 1e-8
#define MOD 1000000007
#define INF 1000000000
#define lb(x) x & -x
int m;
int N=<<;
char o[MAXN];
int c[][];
int ch;
map<int,int>h;
void change(int *c,int x,int y)
{
for(; x <= N; x += lb(x))
{
c[x] += y;
}
}
int ask(int *c,int x)
{
int re=;
for(; x; x -= lb(x))
{
re += c[x];
}
return re;
}
int main()
{
int i;
int x;
scanf("%d",&m);
while(m--)
{
scanf("%s",o);
if(o[] == 'I')
{
scanf("%d",&x);
h[x - ch]++; //ch为偏移量
for(i = ; i <= ;i++)
{
change(c[i],(x - ch & (( << i) - )) + ,);//维护树状数组
}
}
if(o[] == 'D')
{
scanf("%d",&x);
for(i = ; i <= ; i++)
{
change(c[i],(x - ch & (( << i) - )) + ,-h[x - ch]);//正常的删除操作
}
h[x - ch] = ;
}
if(o[] == 'A')
{
scanf("%d",&x);
ch += x;
}
if(o[] == 'Q')
{
scanf("%d",&x);
int ans = ;
ans += ask(c[x + ],min(max(( << x + ) - (ch & (( << x + ) - )),), << x + ));
ans -= ask(c[x + ],min(max(( << x) - (ch & (( << x + ) - )),), << x + ));
//这里最不好理解,前两句是统计没有进位的情况
//下两句统计进位的情况,有点复杂
//这块理解不了可以去链接看一眼 (其实我也不太懂)
ans += ask(c[x + ],min(max(( << x + )-(ch & (( << x + ) - )),), << x + ));
ans -= ask(c[x + ],min(max(( << x) + ( << x + )-(ch & (( << x + ) - )),), << x + ));
printf("%d\n",ans);
}
}
return ;
}
/*
8
INS 1
QBIT 0
ADD 1
QBIT 0
QBIT 1
DEL 2
INS 1
QBIT 1
*/

题干:

Description
  比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作:
  INS M : 将元素 M 插入到集合S中;
  DEL M : 将集合S中所有等于 M 的元素删除;
  ADD M : 将集合S中的所有元素都增加数值M ;
  QBIT k : 查询集合中有多少个元素满足其二进制的第 k位为 。
  初始时,集合S为空集。请实现一个比特集合,并对于所有的QBIT操作输出相应的答案。
Input
  输入第一行包含一个正整数N,表示操作的数目。
  接下来N行,每行为一个操作,格式见问题描述。
Output
  对于每一个QBIT操作,输出一行,表示相应的答案。
Sample Input INS QBIT ADD QBIT QBIT DEL INS QBIT Sample Output HINT 数据规模和约定   时间限制2s。   对于30%的数据, ≤ N ≤ 。   对于100%的数据, ≤ N ≤ ;QBIT操作中的k满足, ≤ k < 。INS/DEL操作中,满足0 ≤ M ≤ ^;ADD操作中, 满足0 ≤ M ≤ 。 注意   注意集合S可以包含多个重复元素。 Source 2012国家集训队Round day4

我的凉凉代码(都没写完):

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
priority_queue <int> qu;
int cha[],a[];
int tot[],n,x,q = ;
int k[];
char s[];
void ins(int x)
{
int len = ,ok = ;
clean(k);
while(x != )
{
if(x % == )
{
tot[len]++;
k[len] = ;
if(k[len - ] == )
cha[len]++;
}
x /= ;
len++;
}
}
void add(int x)
{
q += x; }
int main()
{
read(n);
duke(i,,n)
{
scanf("%s",s);
if(s[] == 'I')
{
read(x);
ins(x);
qu.push(x - q);
}
else if(s[] == 'A')
{
read(x);
add(x);
}
else if(s[] == 'D')
{
read(x);
del(x);
}
else
{
read(x);
qbit(x);
}
}
}

正解(不是我写的,但是我改了一下,加了点注释)

B2568 比特集合 树状数组的更多相关文章

  1. UVALive 6911---Double Swords(贪心+树状数组(或集合))

    题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  2. Solution -「树状数组」 题目集合

    T1 冒泡排序 题目描述 clj 想起当年自己刚学冒泡排序时的经历,不禁思绪万千 当年,clj 的冒泡排序(伪)代码是这样的: flag=false while (not flag): flag=tr ...

  3. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  4. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

  5. 【BZOJ-1103】大都市meg 树状数组 + DFS序

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2009  Solved: 1056[Submit][Sta ...

  6. poj 2985 The k-th Largest Group 树状数组求第K大

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted ...

  7. 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化

    http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...

  8. bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Sta ...

  9. hdu_2227_Find the nondecreasing subsequences_树状数组,离散化

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 题意:给你一个集合,让你求递增子序列有多少个,和树状数组求逆序对差不多,不过数据比较大,要离散化 ...

随机推荐

  1. html5——伸缩比例

    基本概念 1.父盒子设置了伸缩属性,子盒子设置伸缩比例 2.以上设置完之后子盒子会按照比例分布在父盒子中 3.当设置伸缩比例时默认会按照x轴方向分配,因为默认情况下伸缩布局主轴方向是x轴方向 4.设置 ...

  2. 【sqli-labs】 less60 GET -Challenge -Double Query -5 queries allowed -Variation3 (GET型 挑战 双查询 只允许5次查询 变化3)

    http://192.168.136.128/sqli-labs-master/Less-60/?id=1")%23 http://192.168.136.128/sqli-labs-mas ...

  3. CAD对象的夹点被编辑完成后调用事件(com接口VB语言)

    主要用到函数说明: _DMxDrawXEvents::ObjectGripEdit 对象的夹点被编辑完成后,会调用该事件,详细说明如下: 参数 说明 LONGLONG lId 对象的id LONG i ...

  4. Linux内核同步:per_cpu变量

    per cpu变量相关函数和宏 DEFINE_PER_CPU_SHARED_ALIGNED(type,name):静态分配per_cpu数组,数组名为name,结构类型为type DEFINE_PER ...

  5. [nodejs]在mac环境下如何将node更新至最新?

    在mac下安装angular-cli时,报出较多错误.初步怀疑是因为node环境版本过低导致. 在mac下,需要执行如下几步将node更新至最新版本,也可以更新到指定版本 1. sudo npm ca ...

  6. web前端习总结--JavaScript

    JavaScript 什么是JavaScript JavaScript是嵌入HTML中在浏览器中的脚本语言,有与Java和C语言类似的语法 一种网页编程技术,用来向HTML页面添加交互行为 直接嵌入H ...

  7. 找零钱的算法实现(Java)

    简单的算法 基本思路就是将面值从大到小统计(外循环), 若当前金额大于某面值, 则当前金额减掉该面值, 并将面值对应张数+1, 继续往下判断(内循环) public void Change(int m ...

  8. MySql 日志查看与设置

    错误日志log-errol 开启方式:在my.ini的[mysqld]选项下:添加代码:log-error=E:\log-error.txt 记录内容:主要是记录启动.运行或停止mysqld时出现的致 ...

  9. SVG格式图片转成HTML中SVG的Path路径

    AI图标制作完成之后,保存的svg文件包含许多AI的信息,如果要在HTML中使用,我们需要在svg文件中提取/修改信息,重新保存. 1.在AI中已经完成图标,要保存SVG文件,点击“文件(File)” ...

  10. Beetl学习总结(2)——基本用法

    2.1. 安装 如果使用maven,使用如下坐标 <dependency> <groupId>com.ibeetl</groupId> <artifactId ...