博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JZOJ #4711 Binary (按位操作 + 树状数组)
阅读量:5332 次
发布时间:2019-06-14

本文共 1974 字,大约阅读时间需要 6 分钟。

题目描述:

给出整数序列,每次修改其中一个数的值,或给出$x,y$询问 $\sum_{i=1}^{n}(a_i+x)\&y$。

解题思路:

看到位运算,要想到按位做。因为$x\&2^i$的结果随$x$是循环的,有$2^i$个$0$, $2^i$个$2^i$轮流出现。所以我们记录$x\%2^{i+1}$的值,这样$x$和$2^i$操作后有值时,仅当$x\%2^{i+1}$的结果在$[2^i,2^{i+1})$。而因为询问时会加上一个数,所以我们要把它减掉,如果减掉后区间有负怎么办。注意到前面说是循环的,所以把负的那段补到后面就好了。

代码:

1 #include 
2 #include
3 #include
4 #define i64 long long 5 using namespace std; 6 7 const int N = 1e5 + 10; 8 int n, q, a[N], Sum[21][1 << 21], pow[21]; 9 i64 ans;10 11 int lowbit(int x) {
return x & -x;}12 13 void add(int x, int p, int v) {14 p ++;15 while (p <= pow[x + 1] + 1) Sum[x][p] += v, p += lowbit(p); 16 }17 18 int sum(int x, int p) {19 int r = 0;20 p ++;21 while (p) r += Sum[x][p], p -= lowbit(p);22 return r;23 }24 25 int main() {26 pow[0] = 1;27 for (int i = 1; i <= 20; i ++) pow[i] = pow[i - 1] * 2;28 scanf("%d %d", &n, &q);29 for (int i = 1; i <= n; i ++) {30 scanf("%d", &a[i]);31 for (int j = 1; j <= 20; j ++) add(j - 1, a[i] % pow[j], 1);32 }33 while (q --) {34 int opt, x, y;35 scanf("%d %d %d", &opt, &x, &y);36 if (opt == 1) {37 for (int i = 1; i <= 20; i ++) add(i - 1, a[x] % pow[i], -1);38 a[x] = y;39 for (int i = 1; i <= 20; i ++) add(i - 1, a[x] % pow[i], 1);40 }41 if (opt == 2) {42 ans = 0;43 for (int i = 1; i <= 20; i ++) if (y & pow[i - 1]) {44 int l = pow[i - 1], r = pow[i] - 1, t;45 l = (l - x - 1 + pow[20]) % pow[i];46 r = (r - x + pow[20]) % pow[i];47 if (l <= r) t = sum(i - 1, r) - sum(i - 1, l);48 else t = sum(i - 1, r) + sum(i - 1, pow[i]) - sum(i - 1, l);49 ans += 1ll * t * pow[i - 1];50 }51 printf("%lld\n", ans);52 }53 }54 return 0;55 }

 

转载于:https://www.cnblogs.com/awner/p/5782262.html

你可能感兴趣的文章
asp.net 写入excel时,不能更新。数据库或对象为只读。
查看>>
linux清空日志文件内容 (转)
查看>>
jsp中对jstl一些标签的引用方式
查看>>
安卓第十三天笔记-服务(Service)
查看>>
Servlet接收JSP参数乱码问题解决办法
查看>>
【bzoj5016】[Snoi2017]一个简单的询问 莫队算法
查看>>
Ajax : load()
查看>>
分布式版本控制系统
查看>>
MySQL-EXPLAIN执行计划Extra解释
查看>>
Zookeeper概述
查看>>
Zookeeper一致性级别
查看>>
单例模式的几种实现方式及对比
查看>>
第十二周学习记录
查看>>
HDU 1712 ACboy needs your help (分组背包模版题)
查看>>
共享内存
查看>>
从零开始学JavaWeb
查看>>
第33天-文件I/O _2(2013.09.03)
查看>>
讨厌的 StorageFolder.GetFileAsync 异常。
查看>>
Tomcat源码浅析
查看>>
Codeforces Round #256 (Div. 2) Multiplication Table
查看>>