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

题解链接

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

#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. Git 分支创建

    分支策略:git上始终保持两个分支,master分支与develop分支.master分支主要用于发布时使用,而develop分支主要用于开发使用. 创建master的分支developgit che ...

  2. Centos安装smokeping教程

    Centos安装smokeping教程 一 .安装基本依赖包 ntpdate time.windows.com #64bit rpm -Uhv http://apt.sw.be/redhat/el6/ ...

  3. SYN(synchronous)TCP/IP

    SYN(synchronous)是TCP/IP建立连接时使用的握手信号.在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息, ...

  4. nginx设置绑定解析实现二级域名多域名

    apache(httpd)配置多个二级域名看这个链接:https://www.cnblogs.com/Crazy-Liu/p/10879928.html 网站的目录结构为/home/www├── bb ...

  5. 【Apache Kafka】一、Kafka简介及其基本原理

      对于大数据,我们要考虑的问题有很多,首先海量数据如何收集(如Flume),然后对于收集到的数据如何存储(典型的分布式文件系统HDFS.分布式数据库HBase.NoSQL数据库Redis),其次存储 ...

  6. Luogu P2068 统计和

    P2068 统计和 题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=1000 ...

  7. 关于Spring的69个问题

    Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...

  8. 腾讯云,搭建nginx静态网站服务器

    搭建Http静态服务器环境 任务时间:15min ~ 30min 搭建静态网站,首先需要部署环境.下面的步骤,将告诉大家如何在服务器上通过 Nginx 部署 HTTP 静态服务. 安装 Nginx 在 ...

  9. PAT 1047. Student List for Course

    Zhejiang University has 40000 students and provides 2500 courses. Now given the registered course li ...

  10. GlobalSign 域名型 SSL 证书

      GlobalSign 域名型 SSL 证书,支持通配符型,只验证域名所有权,属于DV 域名验证级SSL证书,无须递交书面审查资料,网上申请便捷有效率.提供40位/56位/128位,最高256位自适 ...