【UOJ UNR #1】争夺圣杯
来自FallDream的博客,未经允许,请勿转载,谢谢。
考虑直接对每个数字,统计它会产生的贡献。
单调栈求出每个数字左边第一个大等于他的数,右边第一个大于他的 (注意只能有一边取等)
假设左右两边分别有x1,x2个数,较大的是mx,较小的是mn
对于长度在(mx+1,mn+mx+1]的x,会产生mn+mx+1 - x - 1的贡献
对于长度在(mn,mx+1]的数,会产生 mn+1的贡献
对于长度在[1,mn]中的数x,会产生x的贡献。
差分维护即可
- #include<iostream>
- #include<cstdio>
- #define MN 1000000
- #define mod 998244353
- using namespace std;
- inline int read()
- {
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- int n,a[MN+],s[MN+],g[MN+],top=,q[MN+],Lt[MN+],Rt[MN+],ans=;
- inline void R(int&x,int y){x+=y;x>=mod?x-=mod:;}
- int main()
- {
- n=read();
- for(int i=;i<=n;++i) a[i]=read();
- for(int i=;i<=n;++i)
- {
- while(top&&a[i]>=a[q[top]]) --top;
- Lt[i]=q[top]+;q[++top]=i;
- }
- q[top=]=n+;
- for(int i=n;i;--i)
- {
- while(top&&a[i]>a[q[top]]) --top;
- Rt[i]=q[top]-;q[++top]=i;
- }
- for(int i=;i<=n;++i)
- {
- int mn=min(i-Lt[i],Rt[i]-i),y=mod-(a[i]%mod),mx=max(i-Lt[i],Rt[i]-i),z=a[i]%mod;
- if(mn>) R(s[],z),R(s[mn+],y);
- R(g[mn+],1LL*(mn+)*z%mod),R(g[mx+],1LL*(mod-mn-)*z%mod);
- R(g[mx+],1LL*(mn+mx+)*z%mod);R(s[mx+],y);
- R(g[mn+mx+],1LL*(mod-mn-mx-)*a[i]%mod);R(s[mn+mx+],z);
- }
- for(int i=;i<=n;++i)
- {
- R(g[i],g[i-]);R(s[i],s[i-]);
- ans^=(1LL*s[i]*i+g[i])%mod;
- }
- printf("%d\n",ans);
- return ;
- }
【UOJ UNR #1】争夺圣杯的更多相关文章
- 【uoj#213】[UNR #1]争夺圣杯 单调栈+差分
题目描述 给出一个长度为 $n$ 的序列,对于 $1\sim n$ 的每一个数 $i$ ,求这个序列所有长度为 $i$ 的子区间的最大值之和,输出每一个 $i$ 的答案模 $998244353$ 后异 ...
- [UOJ213][UNR #1]争夺圣杯
uoj description 一个长为\(n\)的序列,给定一个参数\(m\),求所有长度为\(m\)的区间的最大值之和. 对于所有的\(m\in[1,n]\)你都需要分别求出答案然后异或起来. \ ...
- 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#213. 【UNR #1】争夺圣杯(单调栈)
传送门 我们枚举每一个元素,用单调栈做两遍计算出它左边第一个大于它的位置\(l[i]\)和右边第一个大于它的位置\(r[i]\),那么一个区间以它为最大值就意味着这个区间的左端点在\([l[i]+1, ...
- A. 【UNR #1】争夺圣杯
题解: 一道比较水的题目 按照最一般的思路离散化后枚举最大值 然后考虑最大值的贡献 会发现需要分类讨论一下 发现对一段k的影响是等差数列 所以可以用线段树维护差分数组
- uoj213 【UNR #1】争夺圣杯
题目 设\(f_i\)表示所有长度为\(i\)的区间的最大值的和,求\(\bigoplus \sum_{i=1}^nf_i\) 不难发现随机数据非常好做 由于一个随机序列的前缀最大值期望只会变化\(\ ...
- [UOJ UNR#1]奇怪的线段树
来自FallDream的博客,未经允许,请勿转载, 谢谢. 原题可以到UOJ看,传送门 如果存在一个点是白的,却有儿子是黑的,显然无解. 不然的话,只要所有黑色的“黑叶子”节点,即没有黑色的儿子的节点 ...
- [UOJ UNR #2]积劳成疾
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移 ...
随机推荐
- router问题
var http = require("http"); var router = require("./router.js"); //创建服务器 var ser ...
- CentOS7安装配置iptables防火墙
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/50779761 CentOS7默认的防火墙不是iptables,而是firewall ...
- ASP.NET MVC编程——单元测试
1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...
- Xamarin控件使用之ListView
listview单列多行的显示,以后再加多列多行的实例. [Activity(Label = "GraphicAll", LaunchMode = LaunchMode.Singl ...
- 大数据学习总结(6)what is our foucus
1.搜索业务 2.画像业务 3.关系图谱 借助es构建搜索.画像和关系图谱
- mysql(3)—— 内连接、外连接的区别
先来看一下,内连接的语法: SELECT XXX FROM XXX INNER JOIN XXX ON XXX; 这里 INNER 可以省略,在上一篇博客中我们对于笛卡尔积现象的研究中(http:/ ...
- 小技巧-WEB API第一次加载很慢
原文:http://www.afuhao.com/article_articleId-219.shtml 摘要:ASP.NET页面首次打开很慢,但别的页面如果没有访问过,去访问也会慢.你也许认为它是在 ...
- Java程序优化之替换swtich
关键字switch语句用于多条件判断,功能类似于if-else语句,两者性能也差不多,不能说switch会降低系统性能.在绝大部门情况下,switch语句还是有性能提升空间的. 但是在项目代码中,如果 ...
- countUp.js-让数字动起来
先上一段示例代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- c#代码输入图片
Image bgimage = Image.FromFile(flieUrl + bgImg); if (bgimage != null) { Bitmap bmp1 = new Bitmap(bgi ...