题目描述

给出一个长度为 $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]争夺圣杯 单调栈+差分的更多相关文章

  1. [UOJ213][UNR #1]争夺圣杯

    uoj description 一个长为\(n\)的序列,给定一个参数\(m\),求所有长度为\(m\)的区间的最大值之和. 对于所有的\(m\in[1,n]\)你都需要分别求出答案然后异或起来. \ ...

  2. uoj#213. 【UNR #1】争夺圣杯(单调栈)

    传送门 我们枚举每一个元素,用单调栈做两遍计算出它左边第一个大于它的位置\(l[i]\)和右边第一个大于它的位置\(r[i]\),那么一个区间以它为最大值就意味着这个区间的左端点在\([l[i]+1, ...

  3. uoj#213. 【UNR #1】争夺圣杯

    http://uoj.ac/problem/209 单调栈求出每个位置x左边第一个大于它的位置L[x]和右第一个不小于它的位置R[x],于是矩形L[x]<=l<=x<=r<=R ...

  4. UOJ#213——【UNR #1】争夺圣杯

    1.题意:给一个序列,枚举长度x,然后在这个序列中所有长度为x的区间,我们求出这些区间的最大值之和并取模,最后将所有的异或起来就好啦 2.分析:听说好多人写的 ,特来写一发 的算法骗访问量 话说这个东 ...

  5. 【UOJ UNR #1】争夺圣杯

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 考虑直接对每个数字,统计它会产生的贡献. 单调栈求出每个数字左边第一个大等于他的数,右边第一个大于他的 (注意只能有一边取等) 假设左 ...

  6. uoj213 【UNR #1】争夺圣杯

    题目 设\(f_i\)表示所有长度为\(i\)的区间的最大值的和,求\(\bigoplus \sum_{i=1}^nf_i\) 不难发现随机数据非常好做 由于一个随机序列的前缀最大值期望只会变化\(\ ...

  7. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  8. BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]

    4453: cys就是要拿英魂! Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 46[Submit][Status][Discu ...

  9. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

随机推荐

  1. Python 安装与专属 IDE_Pycharm 安装配置、永久激活,赠汉化版!

    这个为什么说是一次学生时代的经历呢,我的出发点并没有是为了吊胃口.确实,这个Python小应用,只能在学生时代用得着吧,尤其是高中和大学,如果你没有想到也没关系,看完我下面说的就会明白了. 对红蜘蛛软 ...

  2. Form,选择并转移导航菜单

    1.代码实例 <!DOCTYPE html> <html> <head> <title>选择并转移导航菜单</title> <meta ...

  3. How to access business objects with their related ObjectSpaces (Multi-Database Environment)

    https://www.devexpress.com/Support/Center/Question/Details/T565897/how-to-access-business-objects-wi ...

  4. 2018年美国大学生数学建模竞赛(MCM/ICM) 比赛心得

    话不多说,题目先上: 这是我们这次选择的题目,说说建模的那些事! 美赛的时间和国赛挑战杯时间略有不同,貌似多的一天是为了让我们对文章进行一个翻译吧QAQ 建议参加美赛的同学可以参照此计划进行 Day0 ...

  5. lua栈

    既然Lua虚拟机模拟的是CPU的运作,那么Lua栈模拟的就是内存的角色.在Lua内部,参数的传递是通过Lua栈,同时Lua与C等外部进行交互的时候也是使用的栈.,先关注的是Lua栈的分配,管理和相关的 ...

  6. jmeter控制器(二)

    循环控制器: 顾名思义就是做循环控制的,与线程组的循环一样的,不过这里的循环控制器是用在一个单独的模块的,而在线程组里面的循环是作用于全局的.循环控制器里面设置的循环次数是局部有效,只控制自己范围内的 ...

  7. windows 平台安装 ffmpeg

    一.从https://ffmpeg.zeranoe.com/builds/中下载ffmpeg的static版本: 二.将下载下来的“ffmpeg-4.0.2-win64-static.zip”解压到任 ...

  8. Mysql Mariadb 密码问题

    mysql密码遗忘和登陆报错问题   mysql登录密码忘记,其实解决办法很简单,只需要在mysql的主配置文件my.cnf里添加一行“跳过授权表”的参数选择即可! 在my.cnf中添加下面一行:[r ...

  9. Xiuno BBS 4.0 修改时间显示

    修罗开源轻论坛程序 - Xiuno BBS 4.0Xiuno BBS 4.0 是一款轻论坛产品,前端基于 BootStrap 4.0.JQuery 3,后端基于 PHP/7 MySQL XCache/ ...

  10. python3使用csv包,读写csv文件

    python操作csv,现在很多都用pandas包了,不过python还是有一个原始的包可以直接操作csv,或者excel的,下面举个例子说明csv读写csv文件的方法: import os impo ...