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的更多相关文章

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

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

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

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

  3. 【51nod1674】区间的价值 V2(算法效率--位运算合并优化+链表实现)

    题目链接:  51nod1674 题意:规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积.现在l有一个 N 个数的序列,问所有n*(n+1)/2个区间的贡献的和对1 ...

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

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

  5. 51nod 1564 区间的价值 | 分治 尺取法

    51nod 1564 区间的价值 题面 一个区间的价值是区间最大值×区间最小值.给出一个序列\(a\), 求出其中所有长度为k的子区间的最大价值.对于\(k = 1, 2, ..., n\)输出答案. ...

  6. 【51nod】1564 区间的价值

    题解 这个要注意到一个长度大的区间的最大价值一定比长度小的区间的价值要大 然后我们以每个点为最小值,显然区间越长最大值越大,然后我们更新最大区间长度的取值,这个可以用单调栈求这个最小值能更新到的左右端 ...

  7. hdu5696 区间的价值

    区间的价值 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R-L+1). 现在聪明的杰西想要知道,对于长度为k的区间,最大 ...

  8. hdu 5696 区间的价值 单调栈+rmq

    区间的价值 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem D ...

  9. HDU 5696 ——区间的价值——————【线段树、快排思想】

    区间的价值 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

随机推荐

  1. windows 查看物理内存有几条以及查看电脑系统版本号的命令(dxdiag)

  2. 「LuoguP1429」 平面最近点对(加强版)

    题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...

  3. ACM学习历程—Hihocoder编程之美测试赛B题 大神与三位小伙伴(组合数学 )

    时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给你一个m x n (1 <= m, n <= 100)的矩阵A (0<=aij<=10000),要 ...

  4. T(n) = 25T(n/5)+n^2的时间复杂度

    对于T(n) = a*T(n/b)+c*n^k;T(1) = c 这样的递归关系,有这样的结论: if (a > b^k)   T(n) = O(n^(logb(a)));logb(a)b为底a ...

  5. JSOI2008星球大战——联通块数量

    题目:https://www.luogu.org/problemnew/show/1197 此题不能按时间顺序进行删点.求连通块数量,而应打破时间的思维,先形成一张没有要删去的点的图,再从后往前逐个加 ...

  6. 六 Vue学习 首页 (下)

    一:Store介绍: state: 相当于数据 action: action去commit mutations mutation: 只有mutation 才能改变state 例: const stor ...

  7. 四 MySQL数据库表设计

    一: 设计表: user:   ID,  PWD,  name,  type archiveRecord:     referdate,   archiveNum,   owner,   user, ...

  8. JavaScript高级程序设计学习笔记第五章--引用类型

    一.object类型 1.创建object类型的两种方式: 第一种,使用构造函数 var person = new Object();或者是var person={};/与new Object()等价 ...

  9. java 放射机制简介

    放射,说白了就是通过名字加载相应的类,以及类的方法和属性,是为了解决开发中不知道别人会写什么类而采取的一种顺利开发的东东. package com.io; //学生业务类 不知道别人写的 这个是别人写 ...

  10. linux消息队列相关操作

    /* 发送消息队列 */ #include <stdio.h>#include <stdlib.h>#include <string.h>#include < ...