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

uoj

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;
}

原文地址:https://www.cnblogs.com/zhoushuyu/p/9452063.html

时间: 2024-10-31 14:53:06

[UOJ213][UNR #1]争夺圣杯的相关文章

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

http://uoj.ac/problem/209 单调栈求出每个位置x左边第一个大于它的位置L[x]和右第一个不小于它的位置R[x],于是矩形L[x]<=l<=x<=r<=R[x]内的点(l,r)对应的区间[l,r]的最值为x位置的值,这个矩形内的点只对答案数组的二阶差分的四个位置有影响,可以全部统计后再求两次前缀和得到答案. #include<bits/stdc++.h> typedef long long i64; const int N=1e6+7,P=9982

UOJ——【UNR #1】争夺圣杯

1.题意:给一个序列,枚举长度x,然后在这个序列中所有长度为x的区间,我们求出这些区间的最大值之和并取模,最后将所有的异或起来就好啦 2.分析:听说好多人写的O(nlogn) ,特来写一发O(n) 的算法骗访问量 话说这个东西,我们对于每一个点,设这个点的值是max,我们可以求出他影响的所有区间,这个用单调栈解决即可,也就是说求出左边和右边第一个比这个点大的值的位置,设左边那个哪个位置是i,右边那个位置是j,那么我们就能得到这些区间啦,然后我们就可以随便写写就A了 ,这明显是不能AC的,那我们考

UNR #1 题解

虽然题解讲的很清楚...但还是再写一遍骗一点访问量QAQ A. 争夺圣杯 还是想说一下,这题是原题啊...想做的人可以戳codechef上的MTMXSUM(懒得贴链接了,套了个壳,不过正常人应该都能看得出来) 显然异或输出没什么奇怪的性质... 考虑一个元素a[x]在哪些区间中会成为最大值,我们可以用单调栈找出前面比这个元素大的第一个元素a[l],右边大的第一个元素a[r]. 考虑这个元素对每一长度的贡献,设p=x-l,q=r-x,那么对于区间[s,t],只有当l<s<=x,x<=t&l

圣杯布局

圣杯布局是一种三列布局,两边定宽,中间自适应: 圣杯布局的原理就是当子元素处于浮动状态时,设置负margin,子元素会叠盖到兄弟元素之上. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>圣杯布局&

负边距实现圣杯布局以及列等高

圣杯布局如下图所示, 图一 两边的内容宽度固定,中间栏宽度自适应.html代码如下, <div class="container"> <div class='main'> <p>main</p> <p>主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干内容主干

圣杯布局和双飞翼布局的理解和区别

圣杯布局和双飞翼布局基本上是一致的,都是两边固定宽度,中间自适应的三栏布局,其中,中间栏放到文档流前面,保证先行渲染.解决方案大体相同,都是三栏全部float:left浮动,区别在于解决中间栏div的内容不被遮挡上,圣杯布局是中间栏在添加相对定位,并配合left和right属性,效果上表现为三栏是单独分开的(如果可以看到空隙的话),而双飞翼布局是在中间栏的div中嵌套一个div,内容写在嵌套的div里,然后对嵌套的div设置margin-left和margin-right,效果上表现为左右两栏在

css布局之圣杯布局和双飞翼布局

圣杯布局和双飞翼布局 今天看了很多圣杯布局和双飞翼布局的技术博客,通过自己的理解总结一下吧. 1.二者相同点: 实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局.它们实现的效果是一样的. 2.不同点: 圣杯布局知识点:浮动,负边距,相对定位,不需要添加额外标签. 双飞翼:只用到浮动,负边距,不需要使用相对定位,需要添加一个额外的标签. 注意:html结构中中间部分要写在左右布局之前,为了优先渲染. 下面就先来看一下圣杯布局的实现过程吧: 先写出基本DOM结构:

云计算竞争加剧,腾讯云三线齐发,争夺合作伙伴生态

11月2日,腾讯云宣布云服务器.云数据库.云存储和云安全四大核心产品全面调价,最高降幅低至3折起.这是腾讯云史上力度最大的一次价格调整,也是目前行业内幅度最大的一次调价.之前在10月,阿里云刚宣布了五折的降价. 回顾2016年的中国云计算市场,可谓高潮迭起.精彩纷呈,所有的云计算厂商都已经入局,大厂之间的价格战也不断,接下来就看未来两年究竟谁能成为生态型大平台,因为一旦形成平台生态的网络效应,谁就将成为最终赢家. 包括ISV独立软件开发商.SI系统集成商等在内的传统软件商是最重要的云生态合作伙伴

圣杯布局的实现过程

圣杯布局和双飞翼布局,他们的都要求三列布局,中间宽度自适应,两边定宽,这样做的优势是重要的东西放在文档流前面可以优先渲染,而双飞翼布局是对圣杯布局的一种改良,下一篇文章会讲到. 圣杯布局:用到浮动.负边距.相对定位,不添加额外标签 DOM结构: <div class="header">Header</div> <div class="bd"> <div class="main">Main</d