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

题解链接

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

#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. svg文件使用highmap显示

    svg文件使用highmap显示 highmap,ammap都是比较好的第三方插件用来显示svg图片:     ammap导航可能更美观点(这个highmap后面可能也会赶上),     highma ...

  2. phpCURL抓取网页内容

    参考代码1:<?php // 创建一个新cURL资源 $ch = curl_init(); // 设置URL和相应的选项 curl_setopt($ch, CURLOPT_URL, " ...

  3. Python 之读取大文件readline与readlines的差别

    import time def get_all_lines(filename): start_time = time.time() try: f = open(filename, 'rb') exce ...

  4. [luogu2148 SDOI2009] E&D (博弈论)

    传送门 Solution 我们知道当SG不为0则先手必胜,然后就可以打表了 ̄▽ ̄ Code //By Menteur_Hxy #include <cmath> #include <c ...

  5. LVM和RAID

    RAID: Redundant Arrays of Inexpensive Disks Independent Berkeley: A case for Redundent Arrays of Ine ...

  6. python运算符及优先级

    计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 一.算数运算 以下假设变量:a=10,b=20 二.比较运算 ...

  7. noip模拟赛 逃避

    题目描述 给定一篇只含有大小写字母,空格以及 ′.′(不含引号)的长度为 L 的文章.文章被若干个 ′.′ 划分 成若干个句子,句子被若干个空格划分成单词.你需要将文章中每个句子第一个单词的首字母改成 ...

  8. 运维系列之一 Linux的文件与目录权限解析

    在Linux中,万事万物皆文件,普通文件是文件,目录是文件,硬件设备也是文件,因此学习了解Linux中的文件非常重要. Linux中有三种文件类型: (1) 普通文件:又分为文本文件和二进制文件 (2 ...

  9. [bzoj1007][HNOI2008]水平可见直线_单调栈

    水平可见直线 bzoj-1007 HNOI-2008 题目大意:给你n条直线,为你从上往下看能看见多少跳直线. 注释:能看见一条直线,当且仅当这条直线上存在一条长度>0的线段使得这条线段上方没有 ...

  10. Spring MVC SessionAttributes ModelAttribute注解

    说明 本文主要针对 @SessionAttributes注解 和 @ModelAttribute注解的基础用法进行解析.至于为什么会将这两个注解放在一起,是因为它们之间还是有点影响的. @Sessio ...