题目链接:  51nod1674

题意:规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积。现在l有一个 N 个数的序列,问所有n*(n+1)/2个区间的贡献的和对1000000007取模后的结果。

解法:暴力是O(n^2),我是尽量找了相差1的区间之间的规律,枚举区间的右端点可以发现当区间 [ l , r ]在右边新添一个数 r+1 时,答案要加上 [r+1,r+1]、[r,r+1]、[r-1,r+1] ...... [1,r+1]。就可以每次存储 f [ i ] 和 g [ i ] 分别为 [ i , r ] 的“与和”和“或和”。再对 r+1 更新就好。
    当然暴力最先想到的其实是枚举左端点,右端点递增,若有 f[ ] * g[ ] 为0,就枚举下一个左端点,这样或许能水多一点分的。

然而,正解确实是按我想的那个暴力的基础上优化为 O(n log n) 的。因为事实上每次存储的 f[ ] 和 g[ ],都有不少 f [ i ]=f [ j ] 且 g [ i ]=g [ j ],那么就可以合并,这样在枚举右端点的情况下扫描的数目就少了,数目为 log n 级别的。因为 n 的二进制有 log n 位,而每次变化最少是1个位变化,那么不同的 f[ ] 和 g[ ] 不同的组合数最多就是 2*log n(位变化成不同的数)了。那么我们也可以每次对 f[ ] 和 g[ ] 更新时考虑可并。若更新后的值有变化,要不是 f[ ] 有由 1→0,要不就是 g[ ] 有由 0→1,且是不可还原的,也就是不会再由 0→1 或 1→0。它就有可能变成和自己后面的一对 f[ ] 和 g[ ] 相同,若有相同的我们便把它们合并。使用链表实现。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<algorithm>
5 #include<iostream>
6 using namespace std;
7 #define N 100010
8 #define mod 1000000007
9 typedef long long LL;
10
11 LL a[N],sum;
12 int st,ed;
13 struct node{LL f,g;int t,next,last;}s[N];//f[i] 从i到当前的r-1的&值
14
15 void ins(int x,int llast)
16 {
17 s[++ed].t=1; s[ed].f=s[ed].g=a[x];
18 if (llast!=-1) s[ed].last=llast;
19 else s[ed].last=ed-1;
20 s[ed].next=ed+1;
21 sum=(sum+(a[x]*a[x])%mod)%mod;
22 }
23 int main()
24 {
25 int n;
26 scanf("%d",&n);
27 for (int i=1;i<=n;i++)
28 scanf("%I64d",&a[i]);
29 st=1,ed=0; sum=0;
30 ins(1,0);
31 for (int r=2;r<=n;r++)
32 {
33 int llast=-1;
34 for (int i=st;i<=ed;i=s[i].next)
35 {//f 1→0 g 0→1
36 s[i].f=(s[i].f&a[r])%mod;
37 s[i].g=(s[i].g|a[r])%mod;
38 sum=(sum+((LL)(s[i].f*s[i].g)%mod*s[i].t)%mod)%mod;
39 int p=s[i].last;
40 if (p && s[i].f==s[p].f && s[i].g==s[p].g)
41 {
42 if (st==p) st=i;
43 s[i].last=s[p].last;
44 s[s[p].last].next=i;
45 s[i].t+=s[p].t;
46 }
47 if (!s[i].f)
48 {
49 if (!p) st=s[i].next;
50 if (s[i].next>ed) llast=p;//
51 s[s[i].next].last=p;
52 s[p].next=s[i].next;
53 }
54 }
55 ins(r,llast);
56 }
57 printf("%I64d\n",sum);
58 return 0;
59 }

WA

P.S.唉,这题做了2个多小时,还是WA了~TwT

【51nod1674】区间的价值 V2(算法效率--位运算合并优化+链表实现)的更多相关文章

  1. 51nod 1674 区间的价值V2(思维+拆位+尺取法)

    最近被四区题暴虐... 题意:lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值 ...

  2. 1674 区间的价值 V2(分治)

    1674 区间的价值 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有 ...

  3. 剑指offer—算法之位运算(二进制中1的个数)

    位运算: 左移:m<<n将m左移n位,左移后低位补充0: 右移:m>>n将m右移n位,右移后高位补充的是符号位,负数补充1,整数补充0.(正数的边界值为(1,ox7FFFFFF ...

  4. 【51Nod 1674】【算法马拉松 19A】区间的价值 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 对区间分治,统计\([l,r]\)中经过mid的区间的答案. 我的 ...

  5. 51NOD 区间的价值 V2

    http://www.51nod.com/contest/problem.html#!problemId=1674 因为题目要求的只是& 和 | 这两个运算.而这两个运算产生的值是有限的. & ...

  6. 剑指offer算法_位运算求和

    不用+,-,*,/运算求和,可以分成三步: 1.计算两个数字的异或值,相当于只计算每一位的和,不计算进位,得出结果sum: 2.计算两个数字的与值,相当于求出两个数字的进位,然后左移一位,相当于进位, ...

  7. 【科技】位运算(bitset)优化最长公共子序列算法

    最长公共子序列(LCS)问题 你有两个字符串 \(A,B\),字符集为 \(\Sigma\),求 \(A, B\) 的最长公共子序列. 简单动态规划 首先有一个广为人知的 dp:\(f_{i,j}\) ...

  8. 位运算卷积-FWT

    问题 给出两个幂级数 \(f,g\) ,求 \[ h=\sum _i\sum _jx^{i\oplus j}f_ig_j \] 其中 \(\oplus\) 是可拆分的位运算. 算法 由于位运算具有独立 ...

  9. POJ 1753 位运算+枚举

    题意: 给出4*4的棋盘,只有黑棋和白棋,问你最少几步可以使棋子的颜色一样. 游戏规则是:如果翻动一个棋子,则该棋子上下左右的棋子也会翻一面,棋子正反面颜色相反. 思路: 都是暴搜枚举. 第一种方法: ...

随机推荐

  1. FastApi学习(二)

    前言 继续学习 此为第二篇, 还差些知识点就可以结束, 更多的比如用户的身份校验/ swagger 文档修改等以后会单独写 正文 使用枚举来限定参数 可以使用枚举的方式来限定参数为某几个值之内才通过 ...

  2. Tomcat7,Tomcat8 的manager 配置

    1.打开文件:tomcat目录-->conf-->tomcat-users.xml  2.将以下代码替换原来的所有内容,不要犹豫,就是所有内容. <?xml version=&quo ...

  3. 【SpringBoot1.x】SpringBoot1.x 日志

    SpringBoot1.x 日志 日志框架 市面上有很多日志框架,一个日志框架一般包括抽象层和实现. SpringBoot,它的底层是 Spring,而 Spring 框架默认是用 JCL(java. ...

  4. Maven学习笔记之第一个Maven项目(Linux)

    Maven是Apache旗下的管理Java项目jar包的项目管理工具,有了它可以很方便构建和管理我们的Java项目,你不必在互联网上逐个查找你需要的第三方jar包,你只需在maven reposito ...

  5. 【Spring】XML方式实现(无参构造 有参构造)和注解方式实现 IoC

    文章目录 Spring IoC的实现方式 XML方式实现 通过无参构造方法来创建 1.编写一个User实体类 2.编写我们的spring文件 3.测试类 UserTest.java 4.测试结果 通过 ...

  6. 【Linux】在文件的指定位置插入数据

    今天遇到一个似乎很棘手的问题,要在文件的中间,插入几条配置 这里就以my.cnf这个文件为例 1 [mysqld] 2 datadir=/var/lib/mysql 3 socket=/var/lib ...

  7. kubernets之secret资源

    一  对于一些保密度比较高的文件,k8s又是如何存储的呢? 针对那些保密度比较高的配置文件,例如证书以及一些认证配置不能直接存储在configmap中,而是需要存储在另外一种资源中,需要对存储在里面的 ...

  8. 攻防世界 - Crypto(一)

    base64: 根据题目base64可知编码方式,下载附件发现是一个txt文件,把内容用工具解码就彳亍了,即可得到flag, flag: cyberpeace{Welcome_to_new_World ...

  9. XSS - Labs 靶场笔记(下)

    Less - 11: 1.观察界面和源代码可知,依旧是隐藏表单 2.突破点是 $str11=$_SERVER['HTTP_REFERER']; (本题为HTTP头REFERER注入) 3.因此构造pa ...

  10. Django实现文件在本地的存储和读取

    需求介绍:将图片存入本地的电脑文件夹中,将图片的路径保存到数据库,然后通过数据库的路径读取文件: 1.文件的存入: 前端文件: <form class="form-horizontal ...