【uoj#213】[UNR #1]争夺圣杯 单调栈+差分
给出一个长度为 $n$ 的序列,对于 $1\sim n$ 的每一个数 $i$ ,求这个序列所有长度为 $i$ 的子区间的最大值之和,输出每一个 $i$ 的答案模 $998244353$ 后异或起来的结果即可。
$n\le 10^6$ 。
题解
单调栈+差分
考虑位置 $i$ 作为最大值的贡献:使用单调栈求出这个数左面第一个大于等于它的位置 $lp_i$ ,和它后面第一个大于它的位置 $rp_i$ 。
那么所有以它为最大值的区间都满足:左端点在 $[lp_i+1,i]$ 范围内,右端点在 $[i,rp_i-1]$ 范围内。
设 $p=\text{min}(i-lp_i,rp_i-i)$ ,$q=\text{max}(i-lp_i,rp_i-i)$ ,那么 $i$ 的贡献相当于:
给 $[1,p)$ 内的长度 $x$ 加上 $x·a_i$ ;
给 $[p,q)$ 内的长度 $x$ 加上 $p·a_i$ ;
给 $[q,p+q)$ 内的长度 $x$ 加上 $(p+q-x)·a_i$ 。
维护两个差分数组,它们 $i$ 位置的的前缀和分别表示:给 $i$ 位置加上 $该数$ 、给 $i$ 位置加上 $该数·i$ 。
这样区间加、减就相当于在差分数组上修改。
最后统计前缀和,求答案即可。
时间复杂度 $O(n)$
#include <cstdio>
#include <algorithm>
#define N 1000010
#define mod 998244353
using namespace std;
typedef long long ll;
int sta[N] , top , lp[N] , rp[N];
ll a[N] , s[N] , ss[N];
inline void add(ll &x , ll y) {x = (x + y) % mod;}
inline void del(ll &x , ll y) {x = ((x - y) % mod + mod) % mod;}
int main()
{
int n , i , p , q;
ll ans = 0;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%lld" , &a[i]);
while(top && a[i] > a[sta[top]]) top -- ;
lp[i] = sta[top] , sta[++top] = i;
}
top = 0 , sta[0] = n + 1;
for(i = n ; i ; i -- )
{
while(top && a[i] >= a[sta[top]]) top -- ;
rp[i] = sta[top] , sta[++top] = i;
p = i - lp[i] , q = rp[i] - i;
if(p > q) swap(p , q);
add(ss[1] , a[i]) , del(ss[p] , a[i]);
add(s[p] , p * a[i]) , del(s[q] , p * a[i]);
del(ss[q] , a[i]) , add(ss[p + q] , a[i]) , add(s[q] , (p + q) * a[i]) , del(s[p + q] , (p + q) * a[i]);
}
for(i = 1 ; i <= n ; i ++ ) add(s[i] , s[i - 1]) , add(ss[i] , ss[i - 1]) , ans ^= (s[i] + ss[i] * i) % mod;
printf("%lld\n" , ans);
return 0;
}
【uoj#213】[UNR #1]争夺圣杯 单调栈+差分的更多相关文章
- [UOJ213][UNR #1]争夺圣杯
uoj description 一个长为\(n\)的序列,给定一个参数\(m\),求所有长度为\(m\)的区间的最大值之和. 对于所有的\(m\in[1,n]\)你都需要分别求出答案然后异或起来. \ ...
- uoj#213. 【UNR #1】争夺圣杯(单调栈)
传送门 我们枚举每一个元素,用单调栈做两遍计算出它左边第一个大于它的位置\(l[i]\)和右边第一个大于它的位置\(r[i]\),那么一个区间以它为最大值就意味着这个区间的左端点在\([l[i]+1, ...
- uoj#213. 【UNR #1】争夺圣杯
http://uoj.ac/problem/209 单调栈求出每个位置x左边第一个大于它的位置L[x]和右第一个不小于它的位置R[x],于是矩形L[x]<=l<=x<=r<=R ...
- UOJ#213——【UNR #1】争夺圣杯
1.题意:给一个序列,枚举长度x,然后在这个序列中所有长度为x的区间,我们求出这些区间的最大值之和并取模,最后将所有的异或起来就好啦 2.分析:听说好多人写的 ,特来写一发 的算法骗访问量 话说这个东 ...
- 【UOJ UNR #1】争夺圣杯
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 考虑直接对每个数字,统计它会产生的贡献. 单调栈求出每个数字左边第一个大等于他的数,右边第一个大于他的 (注意只能有一边取等) 假设左 ...
- uoj213 【UNR #1】争夺圣杯
题目 设\(f_i\)表示所有长度为\(i\)的区间的最大值的和,求\(\bigoplus \sum_{i=1}^nf_i\) 不难发现随机数据非常好做 由于一个随机序列的前缀最大值期望只会变化\(\ ...
- 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 ...
随机推荐
- 动态权限<二>之淘宝、京东、网易新闻 权限申请交互设计对比分析
移动智能设备的快速普及,给生活带来巨大的精彩,但是智能设备上用户的信息数据很多,隐私数据也非常多,各种各样的app可能通过各种方式在悄悄的收集用户数据,而用户的隐私就变得耐人寻味了.比如之前的可以无限 ...
- oracle 数据库的详细安装教程
由于oracle数据库比较大 所以安装的时候比较慢是目前装的最大的软件了吧 而且如果装崩了 可能还会重装系统 不过比较幸运 一次就装好 1.需要去官网下载 https://www.oracle.co ...
- python打包成exe文件
在cmd命令提示符窗口中输入pip install pyinstaller(在python3的环境下,假如不能安装的话,用pip3 install pyinstaller指令) 使用指令pyinsta ...
- UVa 10055
说一下犯错的地方: 1)没有注意数据范围,题目中是The input numbers are not greater than balabalabala. 而这个32位的int类型恰好装不下2^32, ...
- Ruby知识点三:运算符
1.逻辑运算符 (1)条件1 || 条件2 条件1为假时,才需判断条件2 (2)条件1 && 条件2 条件1为真时,才需判断条件2 2.范围运算符 (1)x..y 从x到y,包括y ...
- 金融科技行业 SDL(转载)
都是一些检查项,值得借鉴,关键在于要能够落地 作者 沈发挺@美的金融科技下载打印版
- python3.6环境中django2.0与xadmin0.6结合的后台管理
1.xadmin简介 django的admin管理后台页面很简洁,对个人来说做后台管理非常简单:xadmin的比较admin优化界面,看着也舒服. xadmin界面效果如下: 2.xadmin安装 从 ...
- dirname命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/xiaofei125145/article/details/50620281 示例一 来自手册页的例子 $ dirname ...
- 面向对象OO第15次作业总结
面向对象OO第15次作业总结 1.论述测试与正确性论证的效果差异,比较其优缺点测试通过大量测试数据来覆盖测试代码,比较直观,优点在于知道测的是啥,特别直观,缺点在于很难覆盖所有情况.正确性论证从逻辑关 ...
- 每日Scrum(10)
今天我们小组整合了下我们所编辑的程序,然后在界面上进行了修改和少部分的完善,现在就等着下午的验收了 任务展板 燃尽图如下: