题目梗概

给出一个n个数。
求所有区间的贡献的加和。
一个区间的贡献:所有数的 and and值 ∗ *所有数的oror值。

解题思路

首先我们要知道对一个数一直 and and或者 or or操作减少或增加的次数是log级别的,这个看成二进制之后就很好思考。

这样我们马上就能想到枚举一个端点,然后维护log段相同的线段(and和or显然需要分开维护)。

考虑加入一个新的节点。
只需要把每个线段加入一个节点,合并值相同的线段。

答案的统计也是非常简单。
效率 O(n∗2logX) O(n*2logX)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100005,maxm=25,tt=1000000007;
int a[maxn],ans,rtot,dtot,n;
struct jz{int x,R;
}d[maxm],r[maxm];
inline int _read(){int num=0;char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9') num=num*10+ch-48,ch=getchar();return num;
}
void work(int x){jz z[maxn];int num;num=dtot;for (int i=1;i<=dtot;i++) z[i]=d[i];dtot=1;d[1].x=a[x];d[1].R=x;for (int i=1;i<=num;i++){if ((z[i].x&a[x])!=d[dtot].x) d[++dtot].x=z[i].x&a[x];d[dtot].R=z[i].R;}num=rtot;for (int i=1;i<=rtot;i++) z[i]=r[i];rtot=1;r[1].x=a[x];r[1].R=x;for (int i=1;i<=num;i++){if ((z[i].x|a[x])!=r[rtot].x) r[++rtot].x=z[i].x|a[x];r[rtot].R=z[i].R;}int i=1,j=1,last=x;while (i<=dtot){int now=min(d[i].R,r[j].R);ans=(ans+(long long)d[i].x*(now-last+1)%tt*r[j].x%tt)%tt;i+=(d[i].R==now);j+=(r[j].R==now);last=now+1;}
}
int main(){freopen("exam.in","r",stdin);freopen("exam.out","w",stdout);n=_read();for (int i=1;i<=n;i++) a[i]=_read();for (int i=n;i>=1;i--) work(i);printf("%d\n",ans);return 0;
}

51Nod 1674——区间的价值 V2相关推荐

  1. 【数学结论】51Nod 1674 区间的价值 V2

    题面在这里 很容易发现,一个序列的前缀and/or值可分为 log(V) log(V)块 其中V是序列中元素的最大值 然后这题就很好做了 枚举区间的右端点i,同时维护每一个块的范围和值 显然有and块 ...

  2. 51Nod1674[区间的价值 V2]--分块

    [链接] 51nod1674 [解题报告] 经典的分块题目. 因为对于一组数 a1,a2,a3,...,an a_1,a_2,a_3,...,a_n的按顺序 and and值是递减的, or or值是 ...

  3. 【and or分块】51Nod1674[区间的价值 V2]题解

    题目概述 给出一个序列 {An} \{A_n\} ,求 ∑ni=1∑nj=iand(ai,ai+1,⋯,aj)∗or(ai,aI+1,⋯,aj) \sum_{i=1}^{n}\sum_{j=i}^{n ...

  4. HDU 5696 区间的价值 暴力

    区间的价值 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5696 Description 我们定义"区间的价值"为一段区间的最大 ...

  5. [hdu] 5696 区间的价值 || 序列分治

    原题 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 求长度分别为1-n的区间的最大价值. 保证数据随机 因 ...

  6. 2016百度之星 初赛(Astar Round2B) 1001 区间的价值

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

  7. [51Nod 1185 威佐夫游戏 V2]Wythoff Game+乘法模拟

    [51Nod 1185 威佐夫游戏 V2]Wythoff Game+乘法模拟 题目链接:[51Nod 1185 威佐夫游戏 V2] 题意描述:有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取 ...

  8. 51NOD 1631 小鲨鱼在51nod小学 区间线段树

    1631 小鲨鱼在51nod小学 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依 ...

  9. 51Nod - 1522 区间dp

    题意: 题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522 思路: 很好的区间dp. 从1开始填起,两个1 ...

最新文章

  1. 联想家庭云中心:天边飘来“故乡的云”
  2. Android Design Support Library初探-更新中
  3. 阿里云服务器 搭建单体redis 以及踩坑
  4. 判断是否为长按_如何判断电路中的IC是在工作?
  5. vb.net word 自定义工具栏_Word双面快速简捷打印?
  6. 2018-06-13 第三十八天
  7. (二)OpenCV Mat常用属性和方法
  8. 软件包的依赖性关系定义
  9. linux tty core code,linux tty core 源码分析(6)
  10. [VBA][EXCEL]插入分页符
  11. VMware虚拟机Ubuntu系统如何连接网络
  12. 用java开发app的步骤,看看这篇文章吧!
  13. 将Outlook中的邮件保存到本地磁盘,释放邮箱空间
  14. 谷歌浏览器下载后安装不了
  15. Canvas 贪吃蛇大作战
  16. python判断两数互质_hide handkerchief(判断两数是否互质)
  17. tp5实现删除服务器或本地文件和文件夹
  18. 作为全球闻名的笔记软件和知识管理工具,印象笔记帮助你简化你的工作、学习和生活
  19. cs1.5服务器fps不稳定,我cs1.5的FPS不稳定,各位帅哥靓姐请给小的一个答复!!...
  20. java http头_JAVA如何获取HTTP请求头

热门文章

  1. 影视解说都是用哪种配音设备的?
  2. 完美主义?perfectionism
  3. python趣头条赚钱_【趣头条Python面试】趣头条后端面试面经。-看准网
  4. JQ 点击头像更换图片(仅是自己留个笔记,不建议参考哈!)
  5. AOP 实现分布式锁
  6. Linux安全配置关闭
  7. J-LinuxShell-W6
  8. mysql数据库日志存储位置_MySQL数据库之mysql日志文件在哪 如何修改MySQL日志文件位置...
  9. 全场景AI推理引擎MindSpore Lite, 助力HMS Core视频编辑服务打造更智能的剪辑体验
  10. 根据简谱的matlab演奏《未闻花名》ed