Codeforces Round #234 (Div. 2) E:http://codeforces.com/problemset/problem/400/E

题意:给你n个数,然后每相邻的两个数可以通过and运算生成一个新的数,然后这些新生成的n-1个数每相邻的两个数又通过and运算成n-2个数,最后只会剩下一个数,然后让你求这n(n+1)/2个数的和,然后每一次会更新最底层的某个数,然后操作之后,输出刚才的总和。

题解:这一题,虽然是看题解,然后自己敲出来的,但是还是有点成就感和收获。首先,这一题的思路很巧妙。如果所有的数都是1或者0,加入说序列是1110001,通过计算,发现其实和就是(3+1)*3/2+(1+1)*1/2==7,与连续1的个数有关,加入连续1的个数是x,那么这连续的x个1,形成的和就是(x+1)*x/2;总和就是把所有连续的1和相加。想到这里,就可以知道,数的范围是1e5,最多是2^17,所以可以把每个数拆成17位,每一位要么是0或者是1,这样只要统计底层的连续1有多少就可以了。num[i][j]表示第j个数的第i位,一开始我们可以计算出总和,然后更新时,如果更新数的这一位和原来相同则这一位不用变化,否则,如果是1要0,可以把ans先减去原来连续个一所形成的和,然后加上这个数左边连续1的和以及右边连续1的和,然后把这一位变成0,如果是0变1,则相反。这一要注意数据范围,在过程中有可能爆int,所以要用long long,并且在求和过程中使用的局部变量也要用long long,由于自己没有注意到这样的问题结果wa 2发,int和long long之间转换出了问题。也许,有人会问这样会不会t,首先事实上没有t,而且跑的很快。从理论上讲,也不会,因为要出现很长的连续的1是很难的,必须保证这个连续的数在某些位上都是1,并且连续,很难,这样的数据很难。所以很快。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=1e5+20;
 7 long long num[18][N];
 8 long long ans;
 9 long long a[N],v;
10 int n,m,p;
11 long long tmp[18];
12 int main(){
13   while(~scanf("%d%d",&n,&m)){
14       memset(num,0,sizeof(num));
15       memset(a,0,sizeof(a));
16       memset(tmp,0,sizeof(tmp));
17       for(int i=1;i<=n;i++){
18         scanf("%I64d",&a[i]);
19         for(int j=0;j<=17;j++){
20             num[j][i]=(a[i]&1);
21             a[i]/=2;
22         }
23       }
24        ans=0;
25       for(int j=0;j<=17;j++){
26             long long temp=0,tp=0;
27          for(int i=1;i<=n;i++){
28             if(num[j][i]==0){
29                 tp+=temp*(temp+1)/2;
30                 temp=0;
31             }
32             else{
33                 temp++;
34             }
35             if(i==n){
36                 tp+=temp*(temp+1)/2;
37                 temp=0;
38             }
39          }
40         ans+=(tp<<j);
41       }
42       for(int i=1;i<=m;i++){
43         scanf("%d%I64d",&p,&v);
44          for(int j=0;j<=17;j++){
45              tmp[j]=(v&1);
46               v/=2;
47         }
48         for(int j=0;j<=17;j++){
49             long long sum=0;
50             int tt=p;
51             if(tmp[j]==num[j][p])continue;
52             long long lnum=0,rnum=0;
53             while(num[j][--tt])
54                 lnum++;
55                 tt=p;
56             while(num[j][++tt])
57                 rnum++;
58             if(tmp[j]==0&&num[j][p]==1){
59                 sum-=(lnum+rnum+1)*(lnum+rnum+2)/2;
60                 sum+=(lnum+1)*lnum/2;
61                 sum+=(rnum+1)*rnum/2;
62                 num[j][p]=0;
63             }
64             else{
65                 sum-=(lnum+1)*lnum/2;
66                 sum-=(rnum+1)*rnum/2;
67                 sum+=(lnum+rnum+1)*(lnum+rnum+2)/2;
68                 num[j][p]=1;
69              }
70            ans+=(sum<<j);
71         }
72          printf("%I64d\n",ans);
73       }
74   }
75
76 }

View Code

转载于:https://www.cnblogs.com/chujian123/p/3887553.html

Inna and Binary Logic相关推荐

  1. !codeforces 400E Inna and Binary Logic-yy-(位运算)

    题意:有n个数存放在数组a1[]中,然后数组a1[]生成数组a2[],a2[]生成a3[].....一直生成an[],公式是ai[k]=ai-1[k]&ai-1[k+1],现在如果把初始数据也 ...

  2. B - Ternary Logic

    B - Ternary Logic Little Petya very much likes computers. Recently he has received a new "Terna ...

  3. Java TreeMap 源码解析

    继上篇文章介绍完了HashMap,这篇文章开始介绍Map系列另一个比较重要的类TreeMap. 大家也许能感觉到,网络上介绍HashMap的文章比较多,但是介绍TreeMap反而不那么多,这里面是有原 ...

  4. java计算时间差距_硬计算和软计算之间的差异

    java计算时间差距 什么是计算? (What is Computing?) The process of accomplishing a particular task with the help ...

  5. 【企业管理】北邮国际学院大二上期末复习

    Question 1 Lecture 8-marketing Marketing: Definition: Marketing is the social and managerial process ...

  6. rasp agent_Rasp Pi上的Perf机器学习

    rasp agent Raspberry Pi上的3种机器学习框架 (3 Frameworks for Machine Learning on the Raspberry Pi) The revolu ...

  7. b开头的跟计算机相关的英文单词,信息英语词汇(B)

    News 信息英语词汇(B) Source: 2008-07-30 我要投稿 论坛   Favorite b box 基址寄存器 b register 基址寄存器 b test 测试 b tree 二 ...

  8. MIT评选出的全球最聪明的50个公司-完整名单(附带往年名单)!

    刚刚在某网站看到"MIT评选出世界上最具智慧50强公司 苹果榜上无名",看了半天居然没名单,没名单你让我看什么! 怒去墙外找来了名单,大家慢慢看-- 以下是2013年的名单: 以下 ...

  9. 【深入理解计算机系统】 一:数值表示与编码

    本课程内容来自于悉尼大学ELEC1601:introduction to the computer system 2.1. Binary Logic The digital electronic ci ...

最新文章

  1. Install Java 8 Ubuntu
  2. 你也可以玩转Skype -- 基于Skype API开发外壳程序入门
  3. 处理音频文件的python模块
  4. 电脑桌面没有计算机图标鼠标也点不起来,为什么我的电脑桌面上的图标有时用鼠标怎么点也没反应呀?...
  5. 【代码笔记】Web-HTML-颜色
  6. python模块用法教程_Python学习之asyncore模块用法实例教程
  7. for in for of区别_这个句型中用介词for还是of?来看看解题技巧
  8. 画流程图的codeproject上有人用wpf实现了一个框架
  9. 管理信息系统重要知识点整理
  10. C# 操作Excel(不需要安装Excel),.Net版的 Excel 控件
  11. DEP bypass
  12. SkipList算法原理分析
  13. C语言 自定义数据类型(结构体 typedef 共用体 位段 枚举)
  14. H3C模拟器配置VLAN
  15. AndroidStudio高德地图获取key
  16. 求职互联网技术岗应届生面试必备技巧分享
  17. Jetpack Compose SideEffect:副作用及相关API
  18. matlab中P代码即P文件加密与逆向工程探讨
  19. 腾讯技术开放日 | 腾讯会议如何进行视频质量评估与优化?
  20. 【C语言】如何将函数内部申请的内存,放到函数外部也能引用到

热门文章

  1. Unity教程:如何使用枚举来帮助简化游戏开发
  2. SSL服务器配置评级指南
  3. 不悲观-不emo-永远保持正能量——21年末,去掉所有的不开心
  4. RabbitMQ是什么东西?
  5. 使用movetable收缩表空间
  6. css之为文本添加线性渐变和外描边
  7. 香港小學一年級入學考試題
  8. Comet:基于 HTTP 长连接的“服务器推”技术解析
  9. 堆栈被无意中修改导致程序挂掉
  10. 使用SDL打造游戏世界之入门篇 - 4