Jzoj4711 Binary
来源:互联网 发布:家用网络50兆 编辑:程序博客网 时间:2024/05/21 08:51
如果没有这个+x的话应该都能想到是按位拆开每一位处理吧
现在考虑这个+x如何处理
一个数v加上x,如果有(v+x)%2^i>2^(i-1)的话,那么就必然第i位为1
所以我们考虑,对于每一个询问的y,若有y&(1<<i)为true,就将所有的数mod (1<<i+1)的值在区间[2^i-x,2^(i+1)-1-x]的个数统计出来,让后乘上2^i就是这一位的贡献,注意特殊处理一下,因为x是在mod (1<<i+1)的意义下的,所以有可能右端点在左端点左边,这时候要拆开来统计
具体实现可以用fenwick树
(一个小小的常熟优化,不要用%2^i而要用&(2^i-1))
#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include<stdio.h>#include<string.h>#include<algorithm>#define f(k) (1ll<<k)#define g(k) (f(k+1)-1)using namespace std;int w[22][1<<20],n,m,v[100010];long long A=0;inline void add(int i,int x,int k){ for(++x;x<=f(i+1);x+=x&-x) w[i][x]+=k; }inline int sum(int i,int x,int s=0){ for(++x;x;x^=x&-x) s+=w[i][x]; return s; }int main(){scanf("%d%d",&n,&m);for(int x,i=1,j;i<=n;++i){scanf("%d",v+i);for(int j=0;j<20;++j) add(j,v[i]&g(j),1);}for(int o,x,y;m--;){scanf("%d%d%d",&o,&x,&y);if(o==1){for(int j=0;j<20;++j)add(j,v[x]&g(j),-1),add(j,y&g(j),1);v[x]=y;} else {A=0;for(int j=0;j<20;++j) if(y&f(j)){int l=f(j)-1,r=g(j);l=(l-x+f(20))&g(j);r=(r-x+f(20))&g(j);if(l<=r) A+=f(j)*(sum(j,r)-sum(j,l));else A+=f(j)*(sum(j,r)+sum(j,f(j+1))-sum(j,l));}printf("%lld\n",A);}}}
阅读全文
1 0
- JZOJ4711. Binary
- [JZOJ4711] Binary
- 【JZOJ4711】Binary
- Jzoj4711 Binary
- 【jzoj4711】【Binary】【树状数组】
- JZOJ4711. 【NOIP2016提高A组模拟8.17】Binary
- 【JZOJ4711】【NOIP2016提高A组模拟8.17】Binary
- [jzoj4711]【NOIP2016提高A组模拟8.17】Binary
- Binary
- Binary
- Binary
- Binary
- binary
- Binary
- binary
- binary
- Binary search
- Binary tree
- (学习java)没有头结点的单链表
- HTML5 内容模型类别以及html元素
- C语言的翻译环境(编译+链接)
- 2. Add Two Numbers
- Python学习的有道及Google翻译
- Jzoj4711 Binary
- 文章标题
- OSI的参考模型体系结构
- PAT 1001. Battle Over Cities
- jquery中attr和prop的区别
- Python黑帽子学习笔记-----第二章
- Spark性能优化指南——基础篇
- 【Leetcode-easy-136】Single Number
- leetcode 407. Trapping Rain Water II