[UOJ213][UNR #1]争夺圣杯
description
一个长为\(n\)的序列,给定一个参数\(m\),求所有长度为\(m\)的区间的最大值之和。
对于所有的\(m\in[1,n]\)你都需要分别求出答案然后异或起来。
\(n\le10^6\)
sol
枚举区间长度\(m\)看上去不好做,我们改变一下顺序,枚举每个位置\(i\),考虑它对每个长度的答案的贡献。
设\(L_i\)为\(i\)左边第一个大于等于\(a_i\)的数的出现位置,\(R_i\)为\(i\)右边第一个大于(一定需要有一边不能取等)\(a_i\)的数的出现位置。
那么显然\(a_i\)这个数能够贡献的区间就必须满足\(l\in[L_i+1,i],r\in[i,R_i-1]\)。
设\(p=\min(i-L_i,R_i-i),q=\max(i-L_i,R_i-i)\)
对于长度\(x\in[1,p-1]\)的区间,\(a_i\)对它的贡献是\(x\times a_i\)。
对于长度\(x\in[p,q-1]\)的区间,\(a_i\)对它的贡献是\(p\times a_i\)。
对于长度\(x\in[q,p+q-1]\)的区间,\(a_i\)对它的贡献是\((p+q-x)\times a_i\)。
三段分别处理,相等于是在答案数组上区间加一个一次函数,开两个差分数组分别维护一下就行了。
code
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 1e6+5;
const int mod = 998244353;
int n,a[N],L[N],R[N],S[N],top,s[N],ss[N],ans;
inline void add(int &x,int y){x+=y;if(x>=mod)x-=mod;}
inline void mns(int &x,int y){x-=y;if(x<0)x+=mod;}
void cover(int l,int r,int a,int b){
add(ss[l],a);mns(ss[r+1],a);
add(s[l],b);mns(s[r+1],b);
}
int main(){
n=gi();
for (int i=1;i<=n;++i) a[i]=gi();
for (int i=1;i<=n;++i){
while (top&&a[S[top]]<=a[i]) --top;
L[i]=S[top];S[++top]=i;
}
S[top=0]=n+1;
for (int i=n;i;--i){
while (top&&a[S[top]]<a[i]) --top;
R[i]=S[top];S[++top]=i;
}
for (int i=1;i<=n;++i){
int p=i-L[i],q=R[i]-i;if (p>q) swap(p,q);a[i]%=mod;
cover(1,p-1,a[i],0);
cover(p,q-1,0,1ll*p*a[i]%mod);
cover(q,p+q-1,mod-a[i],1ll*(p+q)*a[i]%mod);
}
for (int i=1;i<=n;++i) add(s[i],s[i-1]),add(ss[i],ss[i-1]),ans^=(1ll*ss[i]*i+s[i])%mod;
printf("%d\n",ans);return 0;
}
[UOJ213][UNR #1]争夺圣杯的更多相关文章
- 【uoj#213】[UNR #1]争夺圣杯 单调栈+差分
题目描述 给出一个长度为 $n$ 的序列,对于 $1\sim n$ 的每一个数 $i$ ,求这个序列所有长度为 $i$ 的子区间的最大值之和,输出每一个 $i$ 的答案模 $998244353$ 后异 ...
- uoj213 【UNR #1】争夺圣杯
题目 设\(f_i\)表示所有长度为\(i\)的区间的最大值的和,求\(\bigoplus \sum_{i=1}^nf_i\) 不难发现随机数据非常好做 由于一个随机序列的前缀最大值期望只会变化\(\ ...
- UOJ#213——【UNR #1】争夺圣杯
1.题意:给一个序列,枚举长度x,然后在这个序列中所有长度为x的区间,我们求出这些区间的最大值之和并取模,最后将所有的异或起来就好啦 2.分析:听说好多人写的 ,特来写一发 的算法骗访问量 话说这个东 ...
- 【UOJ UNR #1】争夺圣杯
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 考虑直接对每个数字,统计它会产生的贡献. 单调栈求出每个数字左边第一个大等于他的数,右边第一个大于他的 (注意只能有一边取等) 假设左 ...
- A. 【UNR #1】争夺圣杯
题解: 一道比较水的题目 按照最一般的思路离散化后枚举最大值 然后考虑最大值的贡献 会发现需要分类讨论一下 发现对一段k的影响是等差数列 所以可以用线段树维护差分数组
- uoj#213. 【UNR #1】争夺圣杯
http://uoj.ac/problem/209 单调栈求出每个位置x左边第一个大于它的位置L[x]和右第一个不小于它的位置R[x],于是矩形L[x]<=l<=x<=r<=R ...
- uoj#213. 【UNR #1】争夺圣杯(单调栈)
传送门 我们枚举每一个元素,用单调栈做两遍计算出它左边第一个大于它的位置\(l[i]\)和右边第一个大于它的位置\(r[i]\),那么一个区间以它为最大值就意味着这个区间的左端点在\([l[i]+1, ...
- UNR #1 题解
A. 争夺圣杯 还是想说一下,这题是原题啊...想做的人可以戳codechef上的MTMXSUM(懒得贴链接了,套了个壳,不过正常人应该都能看得出来) 显然异或输出没什么奇怪的性质... 考虑一个元素 ...
- CSS布局 -- 圣杯布局 & 双飞翼布局
按照我的理解,其实圣杯布局跟双飞翼布局的实现,目的都是左右两栏固定宽度,中间部分自适应. 但在这里实现起来还是有一些区别的 [圣杯布局] 在这里,实现了左(200px) 右(220px) 宽度固定,中 ...
随机推荐
- (5)调度器(scheduler)
继承关系 原理介绍 Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或已从场景中移除时,调度器会停止 ...
- curl基本使用
curl简介 linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载. curl可以使用URL的语法模拟浏览器来传输数据,因为它是模拟浏览器,因此它同样支持多种协 ...
- pyDay17
1.用filter求素数. 埃拉托色尼筛选法. #!/usr/bin/env python3 # -*- coding: utf-8 -*- def _odd_iter(): n = 1 while ...
- Python3.x:定时任务实现方式
Python3.x:定时任务实现方式 Python3.x下实现定时任务的方式有很多种方式. 一.循环sleep: 最简单的方式,在循环里放入要执行的任务,然后sleep一段时间再执行.缺点是,不容易控 ...
- mailx配置安装
mailxwget http://ftp.debian.org/debian/pool/main/h/heirloom-mailx/heirloom-mailx_12.5.orig.tar.gztar ...
- Harbor 企业级 Docker Registry
HarBor项目:https://github.com/vmware/harbor 下载:https://github.com/vmware/harbor/releases 安装文档:https:// ...
- 20145326《Java程序设计》第一周学习总结
20145326<Java程序设计>第一周学习总结 教材学习内容总结 转眼间新的一学期终于开始了!为什么我这么期待呢?因为这学期可以上娄嘉鹏老师的java程序设计课,我不是什么电脑天才,之 ...
- MyBatis基本工作原理
Application是程序员开发的Java代码,蓝色为MyBatis框架. API是MyBatis提供的增删改查等功能接口. 老式SQL写法我们在Dao中写SQL: SELECT * FROM us ...
- 解决 Faster R-CNN 图片中框不在一张图片上显示的问题
目录 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 如何解决这个问题? 参考issues 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 在使 ...
- springboot2 统一异常处理
统一异常处理,不需要在每一层上单独捕获异常,只需要关注业务的开发: 代码如下: @RestControllerAdvice @Slf4j public class GlobalExceptionHan ...