P2710-数列【Splay】

正题

题目链接:https://www.luogu.com.cn/problem/P2710


题目大意

nnn个数,mmm次操作要求支持

  1. 插入若干个数
  2. 删除某个位置开始的连续若干个数
  3. 翻转一个区间
  4. 修改一个区间为ttt
  5. 求区间和
  6. 输出一个位置的值
  7. 询问一个区间的最大子段和

解题思路

SplaySplaySplay维护,记录lmaxlmaxlmaxrmaxrmaxrmax然后合并。要注意如果一个区间全是负数不能选空。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define max3(x,y,z) max(max((x),(y)),(z))
using namespace std;
const int N=5e5+10,inf=2147483647/3;
int n,m,tot,root,t[N][2],fa[N],r[N],lazy[N],val[N];
int lmax[N],rmax[N],sum[N],ans[N],siz[N];
void PushUp(int x){lmax[x]=max(lmax[t[x][0]],sum[t[x][0]]+val[x]+lmax[t[x][1]]);rmax[x]=max(rmax[t[x][1]],sum[t[x][1]]+val[x]+rmax[t[x][0]]);ans[x]=max3(ans[t[x][0]],ans[t[x][1]],rmax[t[x][0]]+val[x]+lmax[t[x][1]]);sum[x]=sum[t[x][0]]+sum[t[x][1]]+val[x];siz[x]=siz[t[x][0]]+siz[t[x][1]]+1;return;
}
void Change(int x,int z){if(!siz[x])siz[x]=1;val[x]=z;sum[x]=z*siz[x];if(z>0)lmax[x]=rmax[x]=ans[x]=sum[x];else lmax[x]=rmax[x]=0,ans[x]=z;return;
}
void rev(int x){swap(t[x][0],t[x][1]);swap(lmax[x],rmax[x]);r[x]^=1;return;
}
void PushDown(int x){if(lazy[x]!=-inf){if(t[x][0])Change(t[x][0],lazy[x]),lazy[t[x][0]]=lazy[x];if(t[x][1])Change(t[x][1],lazy[x]),lazy[t[x][1]]=lazy[x];lazy[x]=-inf;}if(r[x]){rev(t[x][0]);rev(t[x][1]);r[x]=0;}PushUp(x);return;
}
void DownData(int x){if(!x)return;DownData(fa[x]);PushDown(x);return;
}
bool Direct(int x)
{return t[fa[x]][1]==x;}
void Connect(int x,int y,int dir)
{t[x][dir]=y;fa[y]=x;return;}
void Rotate(int x){int y=fa[x],z=fa[fa[x]];int xs=Direct(x),ys=Direct(y);Connect(y,t[x][xs^1],xs);Connect(x,y,xs^1);Connect(z,x,ys);PushUp(y);PushUp(x);return;
}
void Splay(int x,int f){DownData(x);while(fa[x]!=f){int up=fa[x];if(fa[up]==f)Rotate(x);else if(Direct(x)==Direct(up))Rotate(up),Rotate(x);else Rotate(x),Rotate(x);}return;
}
int Find(int x,int k){PushDown(x);if(siz[t[x][0]]>=k)return Find(t[x][0],k);if(siz[t[x][0]]+1==k)return x;return Find(t[x][1],k-siz[t[x][0]]-1);
}
int Split(int l,int r){int x=Find(root,l),y=Find(root,r+2);Splay(x,0);Splay(y,x);root=x;return t[y][0];
}
void write(int x){if(!x)return;write(t[x][0]);printf("%d ",val[x]);write(t[x][1]);
}
int main()
{scanf("%d%d",&n,&m);ans[0]=-inf;for(int i=0;i<N;i++)lazy[i]=-inf;siz[1]=1;Change(1,-inf);for(int i=2;i<=n+1;i++){scanf("%d",&val[i]);Change(i,val[i]);t[i][0]=i-1;fa[i-1]=i;PushUp(i); }Change(n+2,-inf);t[n+2][0]=n+1;fa[n+1]=n+2;PushUp(n+2);root=tot=n+2;while(m--){char op[15];scanf("%s",op);if(op[0]=='I'){int x;scanf("%d%d",&x,&n);int l=Find(root,x+1),r=Find(root,x+2);Splay(l,0);Splay(r,l);int last=++tot;scanf("%d",&x);t[r][0]=tot;fa[tot]=r;Change(tot,x);for(int i=2;i<=n;i++){scanf("%d",&x);Change(++tot,x);t[tot-1][1]=tot;fa[tot]=tot-1;}for(int i=tot;i>=last;i--)PushUp(i);Splay(last,0);root=last;}else if(op[0]=='D'){int x;scanf("%d%d",&x,&n);x=Split(x,x+n-1);t[fa[x]][0]=0;PushUp(fa[x]);PushUp(fa[fa[x]]);}else if(op[0]=='R'){int x;scanf("%d%d",&x,&n);x=Split(x,x+n-1);rev(x);PushUp(fa[x]);PushUp(fa[fa[x]]);}else if(op[0]=='M'&&op[2]=='K'){int x,w;scanf("%d%d%d",&x,&n,&w);x=Split(x,x+n-1);Change(x,w);lazy[x]=w;PushUp(fa[x]);PushUp(fa[fa[x]]);}else if(op[0]=='G'&&strlen(op)==7){int x;scanf("%d%d",&x,&n);x=Split(x,x+n-1);printf("%d\n",sum[x]); }else if(op[0]=='G'){int x;scanf("%d",&x);x=Split(x,x);printf("%d\n",val[x]);}else if(op[0]=='M'){int x;scanf("%d%d",&x,&n);x=Split(x,x+n-1);printf("%d\n",ans[x]);}
//		write(root);putchar('\n');}
}

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

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

相关文章

【并查集】【图论】【最小生成树】剑鱼行动(ssl 1618)

剑鱼行动 ssl 1618 题目大意&#xff1a; 求一个平面直角坐标系中的最小生成树 原题&#xff1a; 题目描述 给出N个点的坐标&#xff0c;对它们建立一个最小生成树&#xff0c;代价就是连接它们的路径的长度&#xff0c;现要求总长度最小。N的值在100以内&#xff0c;坐标…

图像处理作业4

图像处理作业4 1. 第二版课本习题4.21 本质没有区别&#xff0c;只将图片放置在中心&#xff0c;而周围填充0的个数不变时&#xff0c;不会影响结果。因为本质都是进行了周期延拓&#xff0c;使得尾部的信息不会被丢弃掉。相当于滤波前将图像进行了平移。需要注意的是&#x…

[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

园子里关于ASP.NET Core Web API的教程很多&#xff0c;但大多都是使用EFMysql或者EFMSSQL的文章。甚至关于ASP.NET Core Web API中使用DapperMysql组合的文章都很少&#xff0c;更别提OracelDapper组合的文章了&#xff0c;那么今天就带着大家一起翻译一篇国外大牛写的关于ASP…

一个c#开发的web绘流系统

本项目为Web版流程图绘图&#xff0c;兼容IE、FF、Chrome等各主流浏览器&#xff0c;提供了各类基础图形&#xff0c;至于如何应用及用来做什么就随各位了&#xff0c;常规的流程图及逻辑辅助、工作流等皆可胜任。本系统虽为开源项目&#xff0c;然精心调配开发测试&#xff0c…

【二进制】17倍

17倍 题目大意&#xff1a; 有一个二进制数&#xff0c;求它的17倍 原题: 题目描述&#xff1a; 在了解做软件开发可能赚很多的钱之后&#xff0c;农夫约翰也开了一家小的软件公司为客户写程序。约翰的第一个任务对他来说看起来相当简单&#xff1a;输入一个数N&#xff0…

图像处理作业第五次

第5次图像处理作业 1. 复习理解课本中最佳陷波滤波器进行图像恢复的过程&#xff0c;请推导出w(x,y)最优解的计算过程. 根据公式: σ21(2a1)(2b1)∑∑[g−wη−(gˉ−wηˉ)]2\sigma ^2 \frac{1}{(2a1)(2b1)}\sum\sum[g-w\eta - (\bar g-w\bar\eta)]^2σ2(2a1)(2b1)1​∑∑[g…

2020牛客国庆集训派对day8G-Shuffle Cards【Splay】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7865/G 题目大意 nnn个数从1∼n1\sim n1∼n&#xff0c;mmm次拿出其中一段放到头部&#xff0c;求最终序列。 解题思路 用SplaySplaySplay拿出一段区间然后丢到头部就好了。 时间复杂度O(nlog⁡n)O(n\log n)O(nlogn) cod…

将系统分解为微服务的策略

几年前&#xff0c;Vladik Khononov和他的团队决定开始使用微服务&#xff0c;但是几个月后他们发现自己陷入了巨大的混乱之中。他在最近于伦敦Skills Matter举行的DDD eXchange 2018会议上指出&#xff0c;造成这一现象的原因在于&#xff0c;他们只专注于采用酷炫的新技术&am…

图像处理作业 第8次

图像处理作业 第8次 7.11 说明尺度函数ϕ(x)1,0.25≤x<0.75\phi(x)1 ,0.25 \le x\lt 0.75ϕ(x)1,0.25≤x<0.75并未满足多分辨率分析的第二个要求. ϕ1,0(x)2ϕ(2x)1\phi_{1,0}(x)\sqrt 2 \phi(2x)1ϕ1,0​(x)2​ϕ(2x)1 当且仅当满足0.125≤x<0.3750.125 \le x\lt 0…

【dfs】马蹄印

马蹄印 题目大意&#xff1a; 有一个只含括号的图&#xff0c;要你走一条路&#xff08;从左上角出发&#xff09;&#xff0c;使你走的路上的括号加在一起是先k个左括号再k个右括号组成的&#xff0c;要求k最大 原题&#xff1a; 题目描述&#xff1a; 虽然当奶牛贝里斯找…

P4852-yyf hates choukapai【单调队列优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4852 题目大意 给出n,m,c,dn,m,c,dn,m,c,d&#xff0c;有n∗cmn*cmn∗cm张卡牌。进行nnn次连抽mmm次单抽&#xff0c;连抽连续ccc张卡牌会获得第一张卡牌的欧气值&#xff0c;单抽可以获得抽到卡牌的欧气值。不能连续进行dd…

P4317-花神的数论题【组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/P4317 题目大意 定义sum(i)sum(i)sum(i)表示iii二进制下111的个数 求∏i1nsum(i)\prod_{i1}^nsum(i)i1∏n​sum(i) 解题思路 考虑计算有iii个111的有多少个数字。 对于nnn的每一个111&#xff0c;我们可以知道如果这一位为…

【暴力】排队的奶牛

排队的奶牛 题目大意&#xff1a; 有一个序列&#xff0c;要你删去序列中的一类相同的数&#xff0c;然后求最长的相同数字段的长度 原题&#xff1a; 题目描述 农夫约翰的N只奶牛排成了一条直线&#xff0c;每只奶牛都有一个特定的标识序号&#xff0c;从左到右第i只奶牛…

NOIP2019 Emiya家今天的饭

NOIP2019 Emiya家今天的饭 ACM退役选手远程口胡 csf如今真的是太菜了,最后16分的做法愣是想了一下午 考虑使用容斥方法: 1 采用动态规划,先求出在无限制情况下,安排kkk种烹饪方法总的方案数. 记dp2[i][j]dp2[i][j]dp2[i][j]表示已经考虑完前iii种烹饪方法,共做了jjj个菜的方…

.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

一、案例结构总览这里&#xff0c;假设我们有两个客户端&#xff08;一个Web网站&#xff0c;一个移动App&#xff09;&#xff0c;他们要使用系统&#xff0c;需要先向IdentityService进行Login以进行验证并获取Token&#xff0c;在IdentityService的验证过程中会访问数据库以…

牛客练习赛71C-数学考试【容斥,dp】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7745/C 题目大意 求一nnn的排列&#xff0c;给mmm个限制pip_ipi​表示1∼pi1\sim p_i1∼pi​不能是pip_ipi​的排列。求方案数。 解题思路 定义fif_ifi​表示1∼pi1\sim p_i1∼pi​是pip_ipi​的排列的情况下1∼pi1\sim …

【DP】景观美化

景观美化 题目大意&#xff1a; 有n个花圃&#xff0c;里面有一定的泥土&#xff0c;可以将泥土运到别的花圃&#xff0c;也可以填入&#xff0c;也可以挖出&#xff0c;现在要改变花圃中的泥土数量&#xff0c;问最少花多少钱 原题&#xff1a; 题目描述&#xff1a; 农夫…

CentOS安装使用.netcore极简教程(免费提供学习服务器)

本文目标是指引从未使用过Linux的.Neter&#xff0c;如何在CentOS7上安装.Net Core环境&#xff0c;以及部署.Net Core应用。 仅针对CentOS&#xff0c;其它Linux系统类似&#xff0c;命令环节稍加调整&#xff1b;需要提前准备好服务器地址、用户名、密码&#xff1b;如果手上…

ASP.NET Core MVC+EF Core从开发到部署

笔记本电脑装了双系统&#xff08;Windows 10和Ubuntu16.04&#xff09;快半年了&#xff0c;平时有时间就喜欢切换到Ubuntu系统下耍耍Linux&#xff0c;熟悉熟悉Linux命令、Shell脚本以及Linux下的各种应用的安装、配置、运行。使用下来的感受是Linux确实相当好使&#xff0c;…

初一模拟赛(4.27)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf320320320100100100100100100100100100202020222hkyhkyhky296296296100100100100100100868686101010333wjjwjjwjj276276276100100100909090868686000444fyfyfy24824824810010010…