【bzoj4750】密码安全 单调栈
题目描述

输入
输出
样例输入
3
1
61
5
1 2 3 4 5
5
10187 17517 24636 19706 18756
样例输出
3721
148
821283048
题解
单调栈
区间异或和比较容易处理,关键在于区间最大值
考虑一个数作为最大值的贡献:使用单调栈处理出一个数左边第一个大于等于它的数的位置lp和右边第一个大于它的数的位置rp。那么该数的贡献为:左端点[lp[i]+1,i],右端点[i,rp[i]-1]。
然后再考虑异或和:区间异或和可以由前缀异或来表示。所以满足条件的区间的异或相当于suml在[lp[i],i-1],sumr在[i,rp[i]-1]的两个数的异或。
我们可以拆位,然后对于前缀异或和的某一位维护前缀1的个数。如果该为异或为1,则说明左边为1,右边为0或左边为0,右边为1。分别把方案数计算出来即可。
注意在计算suml所在区间的前缀相减时lp[i]-1可能为负数,因此需要把数组下标平移1位处理。
#include <cstdio>
#include <cstring>
#define N 100010
#define mod 1000000061
typedef long long ll;
int a[N] , sum[N] , c[N][30] , lp[N] , rp[N] , sta[N] , tot;
int main()
{
int T;
scanf("%d" , &T);
while(T -- )
{
int n , i , j , ans = 0;
scanf("%d" , &n);
memset(c , 0 , sizeof(c));
for(i = 2 ; i <= n + 1 ; i ++ )
{
scanf("%d" , &a[i]) , sum[i] = sum[i - 1] ^ a[i];
for(j = 0 ; j < 30 ; j ++ ) c[i][j] = c[i - 1][j] + (bool)(sum[i] & (1 << j));
}
tot = 0 , sta[0] = 1;
for(i = 2 ; i <= n + 1 ; i ++ )
{
while(tot && a[sta[tot]] < a[i]) tot -- ;
lp[i] = sta[tot] , sta[++tot] = i;
}
tot = 0 , sta[0] = n + 2;
for(i = n + 1 ; i >= 2 ; i -- )
{
while(tot && a[sta[tot]] <= a[i]) tot -- ;
rp[i] = sta[tot] , sta[++tot] = i;
}
for(i = 2 ; i <= n + 1 ; i ++ )
for(j = 0 ; j < 30 ; j ++ )
ans = (ans + ((ll)(c[i - 1][j] - c[lp[i] - 1][j]) * (rp[i] - i - c[rp[i] - 1][j] + c[i - 1][j])
+ (ll)(i - lp[i] - c[i - 1][j] + c[lp[i] - 1][j]) * (c[rp[i] - 1][j] - c[i - 1][j])) % mod
* (1 << j) % mod * a[i]) % mod;
printf("%d\n" , ans);
}
return 0;
}
【bzoj4750】密码安全 单调栈的更多相关文章
- bzoj4750: 密码安全
Description 有些人在社交网络中使用过许多的密码,我们通过将各种形式的信息转化为 01 信号,再转化为整数,可以将这个 人在一段时间内使用过的密码视为一个长度为 n 的非负整数序列 A_1, ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- poj 2559 Largest Rectangle in a Histogram - 单调栈
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19782 ...
- bzoj1510: [POI2006]Kra-The Disks(单调栈)
这道题可以O(n)解决,用二分还更慢一点 维护一个单调栈,模拟掉盘子的过程就行了 #include<stdio.h> #include<string.h> #include&l ...
- BZOJ1057[ZJOI2007]棋盘制作 [单调栈]
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的 ...
- 洛谷U4859matrix[单调栈]
题目描述 给一个元素均为正整数的矩阵,上升矩阵的定义为矩阵中每行.每列都是严格递增的. 求给定矩阵中上升子矩阵的数量. 输入输出格式 输入格式: 第一行两个正整数n.m,表示矩阵的行数.列数. 接下来 ...
- POJ3250[USACO2006Nov]Bad Hair Day[单调栈]
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17774 Accepted: 6000 Des ...
随机推荐
- MySQL-5.7.20主从复制测试[20180110]
前言 MySQL 5.7.20测试主从复制 环境 主库 192.168.1.59 t-xi-sonar01 从库 192.168.1.51 t-xi-orc01 设 ...
- 使用Python对Csv文件操作
csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格: 就可以存储为csv文件,文件内容是: No.,Name,Age,Score 1,mayi, ...
- sql sever 基础 练习题
--1. 求半径2米,高3米的圆柱体体积. declare r @hight float,@r float,@ratio float ,@ v float --声明变量 set @hight=3 -- ...
- python核心编程2 第十三章 练习
13-3.对类进行定制.写一个类,用来将浮点型值转换为金额. class MoneyFmt(object): def __init__(self, value=0.0, flag='-'): self ...
- Co. - Apple - MacBook Pro 快捷键
Mac 键盘快捷键:https://support.apple.com/zh-cn/HT201236 从windows转到mac的童鞋,可能删除键是心中的一个痛,以前习惯一按delete什么都消失,其 ...
- 序列化serialize()与反序列化unserialize()的实例
在写序列化serialize与反序列化unserialize()时,我们先来看看: serialize - 产生一个可存储的值的表示 描述 string serialize ( mixed $valu ...
- Hello,移动WEB—Viewport_Meta标签
二 Viewport meta标签: 语法:<meta name="viewport" content="name=value, name=value" ...
- SQL中EXCEPT函数在 Mysql 和 sqlServer 中的替代方法
示例摘自:极客代码:http://wiki.jikexueyuan.com/project/sql/useful-functions/except-clause.html EXCEPT 子句 EXCE ...
- python实现归并排序,归并排序的详细分析
python实现归并排序,归并排序的详细分析. 学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不 ...
- php柱状图多系列动态实现
<?php require_once 'data.php'; require_once 'jpgraph/src/jpgraph.php'; require_once"jpgraph/ ...