51NOD 区间的价值 V2
http://www.51nod.com/contest/problem.html#!problemId=1674
因为题目要求的只是& 和 |
这两个运算。而这两个运算产生的值是有限的。
&,当产生的值是0的时候,就不会再变化了。
|,当产生的值是(111111111)的时候,值也不变化了。
所以每种运算的状态数也就30种不同的情况。
所以考虑分治,
先算出[mid + 1, R]中的值,就是固定mid + 1,一直向右边&和|
然后在[mid, L]从mid开始一直向左边&和|,这样的话,如果已经得到了右半区间的各种情况,就可以快速算出整个区间的情况。
把and起来得值和or起来得值进行统计,因为每种运算只有30种情况,所以当他们都一样的时候,就压缩在一起,统计有多少个不同的值即可。
30 + 30 = 60
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = + ;
LL a[maxn];
LL ans;
const int MOD = ;
const LL one = ;
int AND[ + ], OR[ + ]; //全部是0或者全部是1后,状态不会变了
int sum[ + ]; //所以两种状态相同的时候,也就900种状态
void calc(int L, int R) {
if (L == R) {
ans = (ans + a[L] * a[L] % MOD) % MOD;
return;
}
int mid = (L + R) >> ;
int len = ;
AND[len] = OR[len] = a[mid + ];
sum[len] = ;
for (int i = mid + ; i <= R; ++i) {
if ((AND[len] & a[i]) == AND[len] && (OR[len] | a[i]) == OR[len]) {
sum[len]++;
} else {
++len;
AND[len] = AND[len - ] & a[i];
OR[len] = OR[len - ] | a[i];
sum[len] = ;
}
}
LL nowAnd = (one << ) - ;
LL nowOr = ;
for (int i = mid; i >= L; --i) {
nowAnd = nowAnd & a[i];
nowOr |= a[i];
for (int j = ; j <= len; ++j) { ans += (nowAnd & AND[j]) * (nowOr | OR[j]) % MOD * sum[j] % MOD;
ans %= MOD;
}
}
calc(L, mid);
calc(mid + , R);
}
void work() {
int n;
cin >> n;
for (int i = ; i <= n; ++i) {
cin >> a[i];
}
calc(, n);
cout << ans << endl;
}
int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
IOS;
work();
return ;
}
51NOD 区间的价值 V2的更多相关文章
- 1674 区间的价值 V2(分治)
		
1674 区间的价值 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有 ...
 - 51nod 1674 区间的价值V2(思维+拆位+尺取法)
		
最近被四区题暴虐... 题意:lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值 ...
 - 【51nod1674】区间的价值 V2(算法效率--位运算合并优化+链表实现)
		
题目链接: 51nod1674 题意:规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积.现在l有一个 N 个数的序列,问所有n*(n+1)/2个区间的贡献的和对1 ...
 - 【51Nod 1674】【算法马拉松 19A】区间的价值 V2
		
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 对区间分治,统计\([l,r]\)中经过mid的区间的答案. 我的 ...
 - 51nod 1564 区间的价值 | 分治 尺取法
		
51nod 1564 区间的价值 题面 一个区间的价值是区间最大值×区间最小值.给出一个序列\(a\), 求出其中所有长度为k的子区间的最大价值.对于\(k = 1, 2, ..., n\)输出答案. ...
 - 【51nod】1564 区间的价值
		
题解 这个要注意到一个长度大的区间的最大价值一定比长度小的区间的价值要大 然后我们以每个点为最小值,显然区间越长最大值越大,然后我们更新最大区间长度的取值,这个可以用单调栈求这个最小值能更新到的左右端 ...
 - hdu5696 区间的价值
		
区间的价值 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R-L+1). 现在聪明的杰西想要知道,对于长度为k的区间,最大 ...
 - hdu 5696  区间的价值   单调栈+rmq
		
区间的价值 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
 - HDU 5696 ——区间的价值——————【线段树、快排思想】
		
区间的价值 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
 
随机推荐
- laravel 5.4 运行 make:auth 报错
			
Laravel 5.4 migrate时报错: Specified key was too long error 问题根源 MySQL支持的utf8编码最大字符长度为3字节,如果遇到4字节的宽字符就会 ...
 - ACM学习历程—BestCoder 2015百度之星资格赛1006 单调区间(组合数学)
			
Problem Description 百小度最近在逛博客,然后发现了一个有趣的问题. 如下图所示,是一个12 位数014326951987 , 它的数字先逐渐变大, 然后变小,再变大,接着变小,又变 ...
 - ACM学习历程——HDU 5014 Number Sequence (贪心)(2014西安网赛)
			
Description There is a special number sequence which has n+1 integers. For each number in sequence, ...
 - 【Lintcode】046.Majority Number
			
题目: Given an array of integers, the majority number is the number that occurs more than half of the ...
 - 闪回之 Flashback Data Archive
			
背景:Oracle 11g 中 Flashback Data Archive 特性.将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和 undo 区别开来,这样就可以为 ...
 - 基于Html5的移动端APP开发框架
			
快速增长的APP应用软件市场,以及智能手机的普及,手机应用:Native(原生)APP快速占领了APP市场,成为了APP开发的主流,但其平台的不通用性,开发成本高,多版本开发等问题,一直困扰着专业AP ...
 - 6  git 生成SSH公钥/私钥   查看公钥
			
如果没有公钥的话就生成公钥私钥: $ ssh-keygen 然后连续回车(一次是位置,两次密码)
 - The Tomcat server configuration at \Servers\Tomcat v8.0 Server at localhost-config is missing. Check the server for erro
			
解决方案 1.选择Eclipse工具栏中的Windows→Perferences 2.remove已经创建的server 3.选择Add重新添加,选择create anew local server ...
 - js避免命名冲突
			
[1]工程师甲编写功能A var a = 1; var b = 2; alert(a+b); [2]工程师乙添加新功能B var a = 2; var b = 1; alert(a-b); [3]上一 ...
 - 流媒体中ffmpeg 命令的使用
			
在linux系统中,使用到的有关流媒体音视频流进行处理的ffmpeg 命令的常用的命令己命令对应的参数如下:记录一下: 1.分离视频音频流 ffmpeg -i input_file -vcodec c ...