题意:有n个数存放在数组a1[]中,然后数组a1[]生成数组a2[],a2[]生成a3[].....一直生成an[],公式是ai[k]=ai-1[k]&ai-1[k+1],现在如果把初始数据也就是数组a1[]里的某一个数换成另一个数,求所有数组的总和是多少。

分析:既然这里的数组生成公式里用到了位与运算,那么就用位运算来做了。

把数字写成二进制,公式的意思就是说同一数组的相邻数字的对应二进制位相与生成下一数组的一个数字的对应二进制位。先求出不做改变前的总和,然后每次改变通过替换数字与原数字每一位的差异来计算由该二进制位的差异引起的总和的差异,也就是说这里计算的基本单位不是每一个数字,而是数字的每一位。具体过程在草稿纸上画图,把a1[]数组的数字写成二进制形式,然后排成一列,对照每一位来找规律。另外预处理总和不能用模拟的方法O(n^2)似乎会超时,也是用位来计算。

小技巧:1<<i 可以表示第i位二进制位的权,也可以与别的数字相与获取该数字的第i位二进制位,从而判断该数字的这一位是1还是0

代码:

#include<iostream>
#include<cstdio>
#define N 100005
using namespace std;
int n,m,a[100005],x,y;
long long sum;
void init()    //预处理不做改变前的所有数组的和
{for(int i=0;(1<<i)<N;i++){int k=1<<i;long long tot=0;for(int j=1;j<=n;j++){if(k&a[j]) tot++;else{sum+=tot*(tot+1)/2*(long long)k;tot=0;}}if(tot) sum+=tot*(tot+1)/2*(long long)k;}
}
void work(int x,int y)    //当替换第x个数字为y时的总和
{for(int i=0;(1<<i)<N;i++){int k=1<<i;if((k&y)==(k&a[x])) continue;long long l=0,r=0;for(int p=x-1;p>0;p--)if(k&a[p]) l++;  else break;for(int p=x+1;p<=n;p++)if(k&a[p]) r++;  else break;long long tmp=(l*r+l+r+1)*(long long)k;    if(k&y) sum+=tmp;else sum-=tmp;}
}
int main()
{cin>>n>>m;sum=0;for(int i=1;i<=n;i++) cin>>a[i];init();while(m--){cin>>x>>y;work(x,y);cout<<sum<<endl;a[x]=y;}
}

!codeforces 400E Inna and Binary Logic-yy-(位运算)相关推荐

  1. Inna and Binary Logic

    Codeforces Round #234 (Div. 2) E:http://codeforces.com/problemset/problem/400/E 题意:给你n个数,然后每相邻的两个数可以 ...

  2. CodeForces - 1368D AND, OR and square sum(位运算+贪心)

    题目链接:点击查看 题目大意:给出 n 个数组成的序列 a ,现在可以进行的操作是,任选两个下标 i 和 j ,满足 i != j ,使得: 设 x = a[ i ] , y = a[ j ] a[ ...

  3. 【CodeForces - 558C】Amr and Chemistry(位运算,bfs,计数,思维,tricks)

    题干: Amr loves Chemistry, and specially doing experiments. He is preparing for a new interesting expe ...

  4. !codeforces 558C Amr and Chemistry-yy题-(位运算相关)

    题意:有n个数,每次进行的操作只能是除以2或者乘以2,求这n个数转换成同一个数字所需要的最小的操作步数 分析: 乍一看题目,觉得好难,对于这种每次有两种情况求最后到达的终点的balabala的我就觉得 ...

  5. CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段)

    CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段) 树状数组仅仅能实现线段树区间改动和区间查询的功能,能够取代不须要lazy tag的线段树.且 ...

  6. 【CodeForces 1042B --- Vitamins】DP+位运算

    [CodeForces 1042B --- Vitamins]DP+位运算 题目来源:点击进入[CodeForces 1042B - Vitamins] Description Berland sho ...

  7. CodeForces - 1451E2 Bitwise Queries (Hard Version)(交互+构造+位运算)

    题目链接:点击查看 题目大意:给出一个长度为 n(n 保证了是 2 的幂次),每个数的范围在 [ 0 , n - 1 ] 的一个数组,现在要求通过有限次操作确定下来这个数组: 询问 a[ i ] xo ...

  8. Powered Addition CodeForces - 1339C(位运算)

    You have an array a of length n. For every positive integer x you are going to perform the following ...

  9. Dreamoon Likes Sequences CodeForces - 1330D(组合数学+位运算)

    Dreamoon likes sequences very much. So he created a problem about the sequence that you can't find i ...

最新文章

  1. Android 改变AlertDialog的大小
  2. vue 巧用过渡效果
  3. .NET新手系列(八)
  4. 7.pip工具的使用
  5. jmeter脚本_性能工具之Jmeter脚本python启动
  6. async与await封装ajax请求
  7. [设计模式]代理模式
  8. 漫画:如何实现大整数相加
  9. Promise 让异步更优
  10. 重磅 | 2019年“中国计算机学会CCF优秀博士学位论文奖”评选结果公告
  11. 2017.4.19 细胞分裂 思考记录
  12. 20150310-删除数组中原有对象
  13. paip.QQ音乐导出歌单总结
  14. (转)知乎:AssetMark,到底是做什么的?
  15. 电子工程师必须知道的12个知识
  16. 使用NanoHttpd在Android项目中搭建服务器
  17. android的otg功能,怎么打开手机OTG功能?
  18. 解决WPS高分辨率下因字体缩放导致字体发虚的问题
  19. HDU2550 百步穿杨
  20. CEF:JavaScript 调用 C++ 函数 Demo(VS2013)

热门文章

  1. java对接聚合支付(计全付)
  2. 51nod CSP-S模拟赛 松鼠大作战【倍增】
  3. 服务器部署的参数文档,服务器的配置参数说明
  4. SAP-MM STO订单详解 8 (库存地点级别的UB STO)
  5. 综武大唐:从剑圣收徒开始(二)
  6. POJ1032 Parliament
  7. 高分子PEG分子量从1000-40000不等,DSPE-PEG9-Mal
  8. python中自定义module的方法及注意事项
  9. jmeter密钥请求
  10. windowsxp计划任务设置方法(附常见错误解决)