P8868 [NOIP2022] 比赛(线段树维护区间历史和)

news/2024/11/14 14:48:17/文章来源:https://www.cnblogs.com/dcytrl/p/18543831

题意

给定排列 \(a,b\)\(q\) 次询问 \(l,r\),你需要求出 \(\sum_{l\le l'\le r'\le r}(\max_{i=l'}^{r'}a_i)(\max_{i=l'}^{r'}b_i)\)\(2^{64}\) 取模的值。

\(n,q\le 2.5\times10^5\)

分析

根据经典套路,按 \(r\) 扫描线,维护两个单调栈,那么加入一个数就相当于进行若干段区间加。当扫到 \(r\) 的时候,每个点 \(l\) 存储的是以 \(l\) 为左端点,分别以 \(1\sim r\) 为右端点的权值之和,而最终的查询就相当于求 \([l,r]\) 的区间历史和是多少。

这个东西看上去就不是很好维护。我们考虑把转移写成矩阵形式,设向量 \(\begin{bmatrix}len\ \sum a\ \sum b\ \sum a\cdot b\end{bmatrix}\),那么,对 \(a\) 进行区间加的转移矩阵就是 \(\begin{bmatrix}1&v&0&0&0\\0&1&0&0&0\\0&0&1&v&0\\0&0&0&1&0\\0&0&0&0&1\end{bmatrix}\),对 \(b\) 进行区间加的转移矩阵就是 \(\begin{bmatrix}1&0&v&0&0\\0&1&0&v&0\\0&0&1&0&0\\0&0&0&1&0\\0&0&0&0&1\end{bmatrix}\),对全局将当前答案加到历史和的转移矩阵是 \(\begin{bmatrix}1&0&0&0&0\\0&1&0&0&0\\0&0&1&0&0\\0&0&0&1&1\\0&0&0&0&1\end{bmatrix}\)。暴力维护矩阵乘法的时间复杂度 \(O(5^3n\log n)\),一脸过不去。

考虑到:

  • 该矩阵是一个上三角矩阵,故我们不需要维护左下部分。
  • 对角线上的元素恒为 1,故我们也不需要维护对角线。
  • \((2,3)\) 上的元素恒为 0(\(\sum a\)\(\sum b\) 肯定没贡献),故我们也不需要维护该位置的值。
  • \((1,2),(3,4)\)\((1,3),(2,4)\) 两个位置的元素恒等(考虑实际意义),故每对位置中维护其中一个即可。
  • 这样我们只需要维护 \(25-15-1-2=7\) 个值,暴力展开矩阵乘法即可。向量乘矩阵是平凡的。

时间复杂度 \(O(n\log n)\)

点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<set>
#include<ctime>
#include<random>
#include<cassert>
#define IOS ios::sync_with_stdio(false)
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define P0 puts("0")
#define P__ puts("")
#define PU puts("--------------------")
#define mp make_pair
#define fi first
#define se second
#define pc putchar
#define pb emplace_back
#define un using namespace
#define popc __builtin_popcountll
#define all(x) x.begin(),x.end()
#define rep(a,b,c) for(int a=(b);a<=(c);++a)
#define per(a,b,c) for(int a=(b);a>=(c);--a)
#define reprange(a,b,c,d) for(int a=(b);a<=(c);a+=(d))
#define perrange(a,b,c,d) for(int a=(b);a>=(c);a-=(d))
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
#define lowbit(x) (x&-x)
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define mem(x,y) memset(x,y,sizeof x)
//#define double long double
//#define int long long
//#define int __int128
using namespace std;
using i64=long long;
using u64=unsigned long long;
using pii=pair<int,int>;
inline int rd(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-48;ch=getchar();}return x*f;
}
template<typename T>
inline void write(T x,char ch='\0'){if(x<0){x=-x;putchar('-');}int y=0;char z[40];while(x||!y){z[y++]=x%10+48;x/=10;}while(y--)putchar(z[y]);if(ch!='\0')putchar(ch);
}
bool Mbg;
const int maxn=2.5e5+5,maxm=4e5+5,inf=0x3f3f3f3f;
const long long llinf=0x3f3f3f3f3f3f3f3f;
int ID,n,Q;
int a[maxn],b[maxn];
int sta[2][maxn],tp[2];
vector<pii>q[maxn];
u64 ans[maxn];
namespace sgt{struct info{u64 len,asum,bsum,absum,hsum;info(){len=asum=bsum=absum=hsum=0;}};struct Tag{u64 wa,wb,ws,hl,ha,hb,hs;Tag(){wa=wb=ws=hl=ha=hb=hs=0;}inline Tag(u64 _a,u64 _b,u64 _c,u64 _d,u64 _e,u64 _f,u64 _g){wa=_a,wb=_b,ws=_c,hl=_d,ha=_e,hb=_f,hs=_g;}inline bool empty(){return !wa&&!wb&&!ws&&!hl&&!ha&&!hb&&!hs;}};inline info operator+(info x,info y){info res;res.len=x.len+y.len;res.asum=x.asum+y.asum;res.bsum=x.bsum+y.bsum;res.absum=x.absum+y.absum;res.hsum=x.hsum+y.hsum;return res;}inline Tag operator+(Tag x,Tag y){Tag res;res.wa=x.wa+y.wa;res.wb=x.wb+y.wb;res.ws=x.ws+y.ws+x.wa*y.wb+x.wb*y.wa;res.hl=x.hl+y.hl+x.wa*y.ha+x.wb*y.hb+x.ws*y.hs;res.ha=x.ha+y.ha+x.wb*y.hs;res.hb=x.hb+y.hb+x.wa*y.hs;res.hs=x.hs+y.hs;return res;}inline info operator+(info x,Tag y){info res;res.len=x.len;res.asum=x.asum+x.len*y.wa;res.bsum=x.bsum+x.len*y.wb;res.absum=x.absum+x.len*y.ws+x.asum*y.wb+x.bsum*y.wa;res.hsum=x.hsum+x.len*y.hl+x.asum*y.ha+x.bsum*y.hb+x.absum*y.hs;return res;}info d[maxn<<2];Tag tag[maxn<<2];inline void pu(int p){d[p]=d[lson(p)]+d[rson(p)];}inline void pt(int p,Tag v){d[p]=d[p]+v,tag[p]=tag[p]+v;}inline void pd(int p){if(!tag[p].empty()){pt(lson(p),tag[p]),pt(rson(p),tag[p]);tag[p]=Tag();}}#define mid ((l+r)>>1)inline void bd(int l=1,int r=n,int p=1){d[p].len=r-l+1;if(l==r)return;bd(l,mid,lson(p)),bd(mid+1,r,rson(p));}inline void upd(int ll,int rr,Tag v,int l=1,int r=n,int p=1){if(ll<=l&&r<=rr)return pt(p,v);pd(p);if(ll<=mid)upd(ll,rr,v,l,mid,lson(p));if(rr>mid)upd(ll,rr,v,mid+1,r,rson(p));pu(p);}info qry(int ll,int rr,int l=1,int r=n,int p=1){if(ll<=l&&r<=rr)return d[p];info res;pd(p);if(ll<=mid)res=res+qry(ll,rr,l,mid,lson(p));if(rr>mid)res=res+qry(ll,rr,mid+1,r,rson(p));return res; }#undef mid
}un sgt;
inline void solve_the_problem(){ID=rd(),n=rd();rep(i,1,n)a[i]=rd();rep(i,1,n)b[i]=rd();Q=rd();rep(i,1,Q){int l=rd(),r=rd();q[r].pb(mp(l,i));}bd();rep(i,1,n){while(tp[0]&&a[i]>a[sta[0][tp[0]]]){upd(sta[0][tp[0]-1]+1,sta[0][tp[0]],Tag(a[i]-a[sta[0][tp[0]]],0,0,0,0,0,0));--tp[0];}upd(i,i,Tag(a[i],0,0,0,0,0,0)),sta[0][++tp[0]]=i;while(tp[1]&&b[i]>b[sta[1][tp[1]]]){upd(sta[1][tp[1]-1]+1,sta[1][tp[1]],Tag(0,b[i]-b[sta[1][tp[1]]],0,0,0,0,0));--tp[1];}upd(i,i,Tag(0,b[i],0,0,0,0,0)),sta[1][++tp[1]]=i;upd(1,i,Tag(0,0,0,0,0,0,1));
//		write(qry(1,i).hsum,10);for(pii qwq:q[i]){int l=qwq.fi,id=qwq.se;info res=qry(l,i);
//			write(res.len,32),write(res.asum,32),write(res.bsum,32),write(res.absum,10);ans[id]=res.hsum;}}rep(i,1,Q)write(ans[i],10);
}
bool Med;
signed main(){
//	freopen(".in","r",stdin);freopen(".out","w",stdout);
//	fprintf(stderr,"%.3lfMB\n",(&Mbg-&Med)/1048576.0);int _=1;while(_--)solve_the_problem();
}
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832957.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

希音面试:亿级用户 日活 月活,如何统计?(史上最强 HyperLogLog 解读)

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

【JetBrains CLion 2024软件下载与安装教程】

1、安装包 CLion2024: 链接:https://pan.quark.cn/s/ed93e8cb245e 提取码:fhwc CLion Pro 2021: 链接:https://pan.quark.cn/s/30927a3da509 提取码:1t2w CLion Pro 2018: 链接:https://pan.quark.cn/s/f3a7af5e8ca6 提取码:PW1E 2、安装教程(建议关闭杀毒软件) 1) …

团队项目Scrum冲刺-day2

一、每天举行站立式会议 站立式会议照片一张昨天已完成的工作成员 任务陈国金 用户模块的部分接口开发凌枫 登录页面陈卓恒 管理题目页面的部分代码谭立业 题目搜索页面的部分代码廖俊龙 接口测试曾平凡 前端页面测试曾俊涛 题目模块的部分接口开发薛秋昊 题目提交模块的部分接…

33 张高清大图,带你玩转 KubeSphere 4.1.2 部署与扩展组件安装

备受瞩目的 KubeSphere 4.1.2 已经正式官宣发布,该版本带来了一个重大优化:增加默认的扩展组件仓库。 这一优化改进,让采用全新的 KubeSphere LuBan 架构的 KubeSphere,真正实现了自由打造高度可扩展和可配置的云原生底座。 KubeSphere 用户仅需要在 K8s 之上,默认安装清爽…

cmu15545-数据访问方式:B+树(B+Tree)

目录基本概念基于磁盘的B+树查询与索引设计选择结点大小(Node Size)合并阈值(Merge Thredshold)变长键(Variable-length Keys)结点内部搜索(Intra-Node Search)优化手段Pointer SwizzlingBε-treesBulk InsertPrefix CompressionDeduplicationSuffix Truncation 基本概…

正向代理理解

正向代理(由客户端代理)

冲刺Day1

Day1 当天站立式会议照片姓名 学号 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难林涛(组长) 3122004618 null 开发登录管理员api 如何进行password保密杨森 3122004629 null 后台文件上传开发 如何进行前后端文件上传协调钟礼骏 3122006504 null 查询家长感兴趣模块…

关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截面积)与相应的功率传输能力。

关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截面积)与相应的功率传输能力。电线截面积 (mm) 额定电流 (A) 适用功率 (W) (220V 电压) 适用功率 (W) (380V 电压)0.5 mm 5 A 1100 W 1900 W0.75 mm 8 A 1760 W 3040 W1.0 mm 10 A 220…

在线性坐标系中绘制对数函数图象

本文记述了用 Matplotlib 在线性坐标系中绘制对数函数图象的例子。 代码主体内容如下: ...def main():fig, ax = plt.subplots(figsize=(8,8)) #1ax = configure_axes(ax, Logarithmic Function, 8, 3, 1, 0.25, 1, 0.25) #2x = np.linspace(0.125, 8, 100) …

【JetBrains Rider 2024软件下载与安装教程】

1、安装包Rider2024: 链接:https://pan.quark.cn/s/f3b3360dccc0 提取码:Z8gA Rider-2023.3.2: 链接:https://pan.quark.cn/s/82b63a1e0df3 提取码:XdA8 2、安装教程(建议关闭杀毒软件) 1) 双击下载安装包exe文件安装,弹窗安装对话框2) 点击下一步3) …