P2042 [NOI2005] 维护数列

news/2025/1/16 18:46:06/文章来源:https://www.cnblogs.com/LG017/p/18675585

P2042 [NOI2005] 维护数列

请写一个程序,要求维护一个数列,支持以下 \(6\) 种操作:

编号 名称 格式 说明
1 插入 \(\operatorname{INSERT}\ posi \ tot \ c_1 \ c_2 \cdots c_{tot}\) 在当前数列的第 \(posi\) 个数字后插入 \(tot\) 个数字:\(c_1, c_2 \cdots c_{tot}\);若在数列首插入,则 \(posi\)\(0\)
2 删除 \(\operatorname{DELETE} \ posi \ tot\) 从当前数列的第 \(posi\) 个数字开始连续删除 \(tot\) 个数字
3 修改 \(\operatorname{MAKE-SAME} \ posi \ tot \ c\) 从当前数列的第 \(posi\) 个数字开始的连续 \(tot\) 个数字统一修改为 \(c\)
4 翻转 \(\operatorname{REVERSE} \ posi \ tot\) 取出从当前数列的第 \(posi\) 个数字开始的 \(tot\) 个数字,翻转后放入原来的位置
5 求和 \(\operatorname{GET-SUM} \ posi \ tot\) 计算从当前数列的第 \(posi\) 个数字开始的 \(tot\) 个数字的和并输出
6 求最大子列和 \(\operatorname{MAX-SUM}\) 求出当前数列中和最大的一段子列,并输出最大和

数据规模与约定

  • 对于 \(100\%\) 的数据,任何时刻数列中最多含有 \(5 \times 10^5\) 个数,任何时刻数列中任何一个数字均在 \([-10^3, 10^3]\) 内,\(1 \le M \le 2 \times 10^4\),插入的数字总数不超过 \(4 \times 10^6\)

Solution:

如果没有最大子段和的话那么这题就是一个普通的平衡树板子,但是有了这个诡异的最大字段和我们就需要在pushup的时候尤为小心

这就是你一道紫题写一个早上的理由?(╯°Д°)╯︵ ┻━┻

由于这题我们要用平衡树维护最大子段和,所以我们需要在 pushup 时加上当前节点的贡献 \(t[x].val\) 同时,如果想写得省事一点,\(lmx,rmx\) 就不能定义为强制取左/右端点时的区间最大,而是不强制取左/右端点的区间最大。其最小值为 \(0\) (可以不取)。只有区间最大字段和 \(mx\) 需要强制取。

然后这题按题意维护平衡树即可。

还有就是这题虽然最多只有 \(5*10^5\) 个数同时在线,但是历史可能有 \(4*10^6\) 个数,所以我们需要将那些被用过的闲置空间放到 【数据删除】 上回收一下

然后这题就愉快(存疑)的做完了

Code:

#include<bits/stdc++.h>
const int N=5e5+5;
using namespace std;
inline int Max(int x,int y){return x>y ? x : y;}
int n,m,rt,cnt;
queue<int> Q;
int A[N];
//FHQ_Treap:
struct Tree{int ls,rs,val,lmx,rmx,mx,sum,tag,rev,siz,pri;
}t[N];
inline int rd(){return rand()*rand()+17;}
inline int Node(int val){int res=Q.front();Q.pop();t[res]={0,0,val,Max(0,val),Max(0,val),val,val,N,0,1,rd()};return res;}
int flag=0;
inline void pushup(int x)
{int ls=t[x].ls,rs=t[x].rs;t[x].siz=t[ls].siz+t[rs].siz+1;t[x].sum=t[ls].sum+t[rs].sum+t[x].val;t[x].lmx=Max(Max(t[ls].lmx,t[ls].sum+t[rs].lmx+t[x].val),0);t[x].rmx=Max(Max(t[rs].rmx,t[rs].sum+t[ls].rmx+t[x].val),0);t[x].mx=Max(t[ls].rmx+t[rs].lmx,0)+t[x].val;if(ls)t[x].mx=Max(t[x].mx,t[ls].mx);if(rs)t[x].mx=Max(t[x].mx,t[rs].mx);
}
inline void rev(int x)
{swap(t[x].lmx,t[x].rmx);t[x].rev^=1;swap(t[x].ls,t[x].rs);
}
inline void change(int x,int tag)
{t[x].sum=t[x].siz*tag;t[x].lmx=t[x].rmx=max(0,t[x].sum);t[x].mx=max(t[x].sum,tag);t[x].val=t[x].tag=tag;
}
inline void pushdown(int x)
{int ls=t[x].ls,rs=t[x].rs,tag=t[x].tag;if(t[x].rev){if(ls)rev(ls);if(rs)rev(rs);t[x].rev=0;}if(t[x].tag!=N){if(ls)change(ls,tag);if(rs)change(rs,tag);t[x].tag=N;}return ;
}
inline void splite(int x,int &a,int &b,int k)
{if(!x){a=b=0;return ;}int tmp=t[t[x].ls].siz+1;pushdown(x);if(k>=tmp){a=x;splite(t[x].rs,t[x].rs,b,k-tmp);}else {b=x;splite(t[x].ls,a,t[x].ls,k);}pushup(x);
}
inline int merge(int x,int y)
{if(!x||!y)return x|y;pushdown(x);pushdown(y);if(t[x].pri<t[y].pri){t[x].rs=merge(t[x].rs,y);pushup(x);return x;}else {t[y].ls=merge(x,t[y].ls);pushup(y);return y;}
}
void insert(int pos)
{int a,b;splite(rt,a,b,pos);for(int i=1;i<=A[0];i++){a=merge(a,Node(A[i]));}rt=merge(a,b);A[0]=0;
}
inline void recycle(int x){if(!x)return ;Q.push(x);recycle(t[x].ls);recycle(t[x].rs);}
void del(int x,int tot)
{int a,b,c;splite(rt,a,b,x-1);splite(b,b,c,tot);recycle(b);rt=merge(a,c);
}
void same(int x,int tot,int tag)
{int a,b,c;splite(rt,a,b,x-1);splite(b,b,c,tot);change(b,tag);rt=merge(merge(a,b),c);
}
void reverse(int x,int tot)
{int a,b,c;splite(rt,a,b,x-1);splite(b,b,c,tot);rev(b);rt=merge(merge(a,b),c);
}
void sum(int x,int tot)
{int a,b,c;splite(rt,a,b,x-1);splite(b,b,c,tot);printf("%d\n",t[b].sum);rt=merge(merge(a,b),c);
}
char s[N];
void work()
{cin>>n>>m;for(int i=N-1;i;i--)Q.push(i);for(int i=1;i<=n;i++){scanf("%d",&A[++A[0]]);}insert(0);int pos,tot,tag;for(int i=1;i<=m;i++){scanf("%s",s);if(s[0]=='M'&&s[2]=='X'){printf("%d\n",t[rt].mx);continue;}scanf("%d%d",&pos,&tot);if(s[0]=='I'){for(int i=1;i<=tot;i++)scanf("%d",&A[++A[0]]);insert(pos);continue;}if(s[0]=='D'){del(pos,tot);}if(s[0]=='M'){scanf("%d",&tag);same(pos,tot,tag);}if(s[0]=='R'){reverse(pos,tot);}if(s[0]=='G'){sum(pos,tot);}}
}
int main()
{srand(998244353);//freopen("P2042_2.in","r",stdin);freopen("P2042.out","w",stdout);work();return 0;
}

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

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

相关文章

28. 事件处理

一、事件与事件处理 1.1、什么是事件事件是程序收到外界的输入,处于某种状态时自动发送的信号。事件有固定的类型,每种类型有自己的处理函数,用户只要重写这些函数,即可达到特定的目的。通过事件可以用一个控件监测另外一个控件,并可过滤被监测控件发出的事件。可视化应用…

2025上半年

孩子们,正睿补习计划重启了。 自建题单:ZR 2022 summer B - Virtual Judge P10447 最短 Hamilton 路径 - 洛谷 | 计算机科学教育新生态 求从 \(1\) 号点出发恰好经过每个点一次并且最终回到 \(1\) 号点的最短路径。 设 \(dp_{i,s}\) 表示恰好经过了集合 \(s\) 中的点一次,当…

Agent FFT

Agent FFT请你根据 https://www.cnblogs.com/CDOI-24374/p/17733240.html 这篇文章,仿照写一个好的,以下是一篇仿照《Azune FFT》风格的文章: Azune FFT:异界之战 可能是 Azune 童话系列。感谢 int_R 提供灵感与素材,让奇幻之光照亮一切! ——题记 「报告,INQ。已抵达 …

2025/1/16

今天继续学习了Android开发的相关知识,做手机端的app今天学的是用xml文件控制页面,类似javaweb里面的前端,有许多标签,还解决了运行卡退的一个小问题,需要定义一个主题。

CICD Day9、Argo CD增强持续交付

1、Argo CD简介在Jenkins CI/CD流程中的持续交付阶段,既部署到k8s集群阶段,使用kubectl工具来进行应用程序的部署和更新操作,但这种方式无法实时跟踪应用程序的状态。这将造成用户在CI/CD流程完成后需要额外操作kubernetes集群,以进一步查看应用程序的状态。为了解决这些问…

专为高性能计算和低功耗应用设计的MPF100T-1FCVG484E MPF100TL-FCSG325E MPF100TL-FCVG484I PolarFire FPGA产品系列

‌MPF100TL-FCG484E PolarFire FPGA是Microchip推出的一款高性能、低功耗的FPGA产品系列,特别适用于各种需要高性能计算和低功耗的应用场景‌。‌PolarFire FPGA是Microchip推出的一款高性能、低功耗的FPGA产品系列,特别适用于各种需要高性能计算和低功耗的应用场景‌。这些器…

wordpress 从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。此响应不是合法的JSON响应。解决方法.210721

两种报错方式: 1.此响应不是合法的JSON响应。 2.从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。 情况:媒体服务器上传小文件没问题,大一点的文件报这个错误。 原因:这是因为nginx限制了请求体大小 方案:需要在nginx的虚拟机配置文件中添加…

docker containner挂掉,无法exec进入bash,如何修改文件的终极解决方法.210730

场景: Nginx在bash里面配置的时候挂掉了,然后docker start不起来,exec bash进不去,造成无法再改里面的文件了 解决方法: 1,docker ps –a 可以查到所有docker,包括没有运行的,找到containner ID [root@hecs-29489 ~]# docker ps -a CONTAINER ID IMAGE COMMAND…

HP惠普笔记本重装系统无法引导无法进操作系统的终极解决方法.210804

F9进入BIOS-先进(Advanced)-安全引导配置- 启用传统支持和禁用安全引导.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; padding: 0px 0px 50px 0px } .zsleft { float: left } .zsdiv { display:…

Feign与SpringCloud LoadBalancer实现负载均衡源码分析

SpringCloud LoadBalancer 众所周知,SpringCloud体系中负载均衡的组件有SpringCloud LoadBalancer和Ribbon,Ribbon也在逐渐的被替代掉,因为SpringCloud LoadBalancer性能更高,支持响应式 下面通过hard-coded体现一下SpringCloud的负载均衡 首先有一个【say-hello】服务,提…

JS — 判断语句与循环语句

js的判断语句与循环语句...(* ̄0 ̄)ノ判断语句JavaScript中的if-else语句与C++、Python、Java中类似。直接输出到控制台:test.html中的内容为: <script type="module">let score = 90;if (score >= 85) {console.log("A");} else if (score &g…

Living-Dream 系列笔记 第92期

最小路径点覆盖 在一张 DAG 上,求一个路径的集合,使得它们两两不相交,且覆盖所有的点。 结论:答案即为 \(总点数-最大匹配\)(于是 \(总点数-最大匹配=总点数-最小点覆盖=最大独立集=最大团=最小路径点覆盖\))。 证明: 不妨转换角度,从研究路径转为研究点。 因为路径两两…