uoj213 【UNR #1】争夺圣杯
设\(f_i\)表示所有长度为\(i\)的区间的最大值的和,求\(\bigoplus \sum_{i=1}^nf_i\)
不难发现随机数据非常好做
由于一个随机序列的前缀最大值期望只会变化\(\log\)次,所以完全可以从这个条件上入手
考虑维护一个合并式单调栈,每次插入一个数之后,单调栈中存在的都是当前这个前缀所有的后缀最大值,我们直接暴力扫一遍这些后缀最大值,于是有一些针对\(f\)数组的区间加,我们直接差分维护就好了
这样在数据随机意义下是\(O(n\log n)\)的,一发跑过了除了\(\rm hack\)数据以外的所有数据也是非常惊人
考虑正解,使用单调栈找到一个位置\(i\)左边第一个小于等于他的\(j\),和右边第一个大于他的\(k\),显然在左端点在\([j,i]\)内,右端点在\([i,k)\)的区间的最大值都是\(a_i\),于是直接讨论一下\(a_i\)对这些长度区间的贡献就好了
设\(a=\min(i-j+1,k-i),b=\max(i-j+1,k-i)\)
对于长度为\([1,a]\)的区间,贡献是\(x\times a_i\)
对于长度为\([a+1,b]\)的区间,贡献是\(b\times a_i\)
对于长度为\([b+1,a+b-1]\)的区间,贡献为\((b-x)\times a_i=b\times a_i-x\times a_i\)
维护两个差分数组,一个用于维护这个位置实际上增加了多少,一个用于维护这个位置增加了多少倍的\(x\)
随便就做完了,复杂度是\(O(n)\)的
代码
#include<bits/stdc++.h>
#define re register
#define LL long long
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int mod=998244353;
const int maxn=1e6+5;
int a[maxn],pre[maxn],mn[maxn],t[maxn],st[maxn],c[maxn];
int n,top;LL ans;
inline void calc(int pos) {
int a=t[top]-mn[top]+1,b=pos-t[top]+1;
if(a>b) std::swap(a,b);
int v=st[top]%mod;
if(a<b) {
pre[a+1]=(pre[a+1]+1ll*a*v%mod)%mod;
pre[b+1]=(pre[b+1]-1ll*a*v%mod+mod)%mod;
}
c[1]=(c[1]+v)%mod,c[a+1]=(c[a+1]-v+mod)%mod;
if(b<a+b-1) {
c[b+1]=(c[b+1]-v+mod)%mod,c[a+b]=(c[a+b]+v)%mod;
pre[b+1]=(pre[b+1]+1ll*(a+b)*v%mod)%mod;
pre[a+b]=(pre[a+b]-1ll*(a+b)*v%mod+mod)%mod;
}
}
int main() {
n=read();for(re int i=1;i<=n;++i) a[i]=read();top=0;
for(re int i=1;i<=n;i++) {
int now=i;
while(top&&a[i]>=st[top]) calc(i-1),now=mn[top],top--;
mn[++top]=now,t[top]=i,st[top]=a[i];
}
while(top) calc(n),top--;
for(re int i=1;i<=n;i++) pre[i]=(pre[i-1]+pre[i])%mod;
for(re int i=1;i<=n;i++) c[i]=(c[i-1]+c[i])%mod;
for(re int i=1;i<=n;i++)
pre[i]=(pre[i]+1ll*c[i]*i%mod)%mod,ans^=pre[i];
printf("%lld\n",ans);
}
uoj213 【UNR #1】争夺圣杯的更多相关文章
- [UOJ213][UNR #1]争夺圣杯
uoj description 一个长为\(n\)的序列,给定一个参数\(m\),求所有长度为\(m\)的区间的最大值之和. 对于所有的\(m\in[1,n]\)你都需要分别求出答案然后异或起来. \ ...
- 【uoj#213】[UNR #1]争夺圣杯 单调栈+差分
题目描述 给出一个长度为 $n$ 的序列,对于 $1\sim n$ 的每一个数 $i$ ,求这个序列所有长度为 $i$ 的子区间的最大值之和,输出每一个 $i$ 的答案模 $998244353$ 后异 ...
- 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) 宽度固定,中 ...
随机推荐
- es批量索引
使用Python操作Elasticsearch数据索引的教程 这篇文章主要介绍了使用Python操作Elasticsearch数据索引的教程,Elasticsearch处理数据索引非常高效,要的朋友可 ...
- nodejs moment 修改时间格式 日期格式与时间戳格式互相转化
node js moment 修改时间格式 日期格式与int格式互相转化 nvm use 8.3 > moment = require('moment') > days = '2019-0 ...
- Shell基本正则表达式和扩展正则表达式
BRE和ERE的区别 基本正则表达式(BRE)和扩展正则表达式(ERE)的区别仅仅是元字符(meta charactor)的区别而已. BRE: 只有^$.*[]是元字符 ERE: ^$.[]*+() ...
- System之nanoTime函数
原文地址:https://blog.csdn.net/yumolan4325/article/details/79201766 1 System有一个静态的函数nanoTime函数,该函数是返回纳秒的 ...
- LeetCode 复制带随机指针的链表
题目链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/ 题目大意 略. 分析 空间复杂度 O(1) 的做法非常开拓思维 ...
- 拾遗:Go 基础
这 Go,越看越像是 C 和 Python 的混合体--! gofmt 用于格式化代码,缩进使用 tab,而不是空格:Python 官方则建议使用空格,而不是 tab package Go 惯例,使用 ...
- export 与 export default
export 和 import 都属于 ES6 的内容. node 的 module 遵循的是 CommonJS规范,requirejs遵循AMD,seajs遵循CMD,虽各有不同, 但总之还是希望保 ...
- Eureka配置详解(转)
Eureka客户端配置 1.RegistryFetchIntervalSeconds 从eureka服务器注册表中获取注册信息的时间间隔(s),默认为30秒 2.InstanceInfoR ...
- codeforces 24d Broken robot 期望+高斯消元
题目传送门 题意:在n*m的网格上,有一个机器人从(x,y)出发,每次等概率的向右.向左.向下走一步或者留在原地,在最左边时不能向右走,最右边时不能像左走.问走到最后一行的期望. 思路:显然倒着算期望 ...
- CentOS 7 編譯qBittorrent Web UI安裝指南
前言 以下是安装qBittorrent教学. 适用于CentOS7或更新版本 适用于qBittorrent4.1.5或更新版本 安裝須知 qBittorrent基于libtorrent,所以必须先安装 ...