首页 > 其他分享 >2.2-2.3

2.2-2.3

时间:2023-02-03 20:44:49浏览次数:52  
标签:rs int max sum ls 2.3 2.2 id

P2042 [NOI2005] 维护数列

坑点:

  1. 空间问题,要把删除了的节点循环利用
  2. 修改操作的值可能为0
  3. 时间问题,insert时直接把数列build(l,r),然后合并
  4. 最大子段和,改了好几遍,每次以为改好了,结果后面又发现错误了,不能为空
  5. 修改操作,会让max1和max2颠倒
点击查看代码
#include<bits/stdc++.h>
using namespace std;

inline int read(){
	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*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}

const int N=5e5+5;
int tot,root,a,b,c,n,m,q,cnt,sq[N];
int ls[N],rs[N],dat[N],val[N],tag[N];
bool laz[N],falg[N];
int siz[N],sum[N],max0[N],max1[N],maxn[N],w[N];//0->l,1->r

int New(int k){
	
	int id=(cnt)?sq[cnt--]:++tot;
	val[id]=sum[id]=maxn[id]=k;
	ls[id]=rs[id]=tag[id]=laz[id]=falg[id]=0;
	max0[id]=max1[id]=max(0,k);
	siz[id]=1;dat[id]=rand();
	return id;
}

void updat(int p){
	if(!p)return ;
	siz[p]=siz[ls[p]]+siz[rs[p]]+1;
	sum[p]=sum[ls[p]]+sum[rs[p]]+val[p];
	max0[p]=max(0,max(max0[ls[p]],max0[rs[p]]+val[p]+sum[ls[p]]));
	max1[p]=max(0,max(max1[rs[p]],max1[ls[p]]+val[p]+sum[rs[p]]));
	maxn[p]=max(0,max1[ls[p]]+max0[rs[p]])+val[p];
	if(ls[p])maxn[p]=max(maxn[p],maxn[ls[p]]);
	if(rs[p])maxn[p]=max(maxn[p],maxn[rs[p]]);
}

void rever(int p){
	swap(ls[p],rs[p]);
	swap(max0[p],max1[p]);
	laz[p]^=1;
}

void cover(int p,int x){
	tag[p]=val[p]=x;
	sum[p]=siz[p]*x;
	maxn[p]=max(x,sum[p]);
	max0[p]=max1[p]=max(0,sum[p]);
	falg[p]=1;
}

void pushdown(int p){
	if(laz[p]){
		if(ls[p])rever(ls[p]);
		if(rs[p])rever(rs[p]);
		laz[p]=0;
	}
	if(falg[p]){
		if(ls[p])cover(ls[p],tag[p]);
		if(rs[p])cover(rs[p],tag[p]);
		tag[p]=falg[p]=0;
	}
}

void split(int p,int k,int &x,int &y){
	if(!p){
		x=y=0;return ;
	}
	pushdown(p);
	if(siz[ls[p]]<k){
		x=p;
		split(rs[p],k-siz[ls[p]]-1,rs[p],y);
	}
	else{
		y=p;split(ls[p],k,x,ls[p]);
	}
	updat(p);
}

int merge(int x,int y){
	if(!x||!y)return x+y;
	if(dat[x]>dat[y]){
		pushdown(x);
		rs[x]=merge(rs[x],y);
		updat(x);
		return x;
	}
	else
	{
		pushdown(y);
		ls[y]=merge(x,ls[y]);
		updat(y);
		return y;
	}
}

void cun(int p){
	if(!p)return ;
	sq[++cnt]=p;
	if(ls[p])cun(ls[p]);
	if(rs[p])cun(rs[p]);
}

void insert(int k,int x){
	split(root,k,a,b);
	root=merge(merge(a,New(x)),b);
}

int build(int l,int r){
	if(l==r)return New(w[l]);
	int mid=(l+r)>>1;
	int x=merge(build(l,mid),build(mid+1,r));
	return x;
}

int main(){
//	freopen("P2042_2.in","r",stdin);
//	freopen("1.out","w",stdout);
	n=read(),m=read();
	int x,y,z;string s;
	for(int i=1;i<=n;i++)w[i]=read();
	root=build(1,n);
	for(int i=1;i<=m;i++){
		cin>>s;
		if(s[0]=='I'){
			x=read(),y=read();
			for(int j=1;j<=y;j++)w[j]=read();
			split(root,x,a,b);
			root=merge(merge(a,build(1,y)),b);
		}
		else if(s[0]=='D'){
			x=read(),y=read();
			split(root,x-1,a,b);
			split(b,y,b,c);
			cun(b);
			root=merge(a,c);
		}
		else if(s[0]=='M'&&s[2]=='K'){
			x=read(),y=read(),z=read();
			split(root,x-1,a,b);
			split(b,y,b,c);
			cover(b,z);
			root=merge(merge(a,b),c);
		}
		else if(s[0]=='R'){
			x=read(),y=read();
			split(root,x-1,a,b);
			split(b,y,b,c);
			rever(b);
			root=merge(a,merge(b,c));
		}
		else if(s[0]=='G'){
			x=read(),y=read();
			split(root,x-1,a,b);
			split(b,y,b,c);
			printf("%d\n",sum[b]);
			root=merge(merge(a,b),c);
		}
		else{
			printf("%d\n",maxn[root]);
		}
	}
	return 0;
}

标签:rs,int,max,sum,ls,2.3,2.2,id
From: https://www.cnblogs.com/mkik/p/17090390.html

相关文章

  • 2023.2.3 寒假集训二阶段总结
    2023.2.3寒假集训二阶段总结新内容与课堂这几天都在讲解有关dp的优化策略以及各种dp等有关知识,其中在计数dp、数位dp、概率与期望dp,数据结构优化dp(斜率优化版题qwq)上......
  • 常见文件头(十六进制)------2023.2.3
    ZIPArchive(zip),         文件头:504B0304       文件尾:504BRARArchive(rar),        文件头:52617221JPEG......
  • B/S端界面控件DevExtreme v22.2新功能 - 如何在日历中显示周数?
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能......
  • 算法--2023.2.2
    1.力扣72--编辑距离classSolution{//典型动态对话问题publicintminDistance(Stringword1,Stringword2){intm=word1.length(),n=word2.......
  • Ubuntu 22.04 GCC Arm 12.2.rel1编译 DAPLink
    ARMmbed/DAPLink项目仓库地址https://github.com/ARMmbed/DAPLinkArmMbed应该属于Arm的机构或者是Arm资助的机构.常用的DAPLink基本上都是从这个项目派生的.仓......
  • 2.2 vp Codeforces Round #848 (Div. 2)
    A-FlipFlopSum题意给出长度为n的序列a,a中只包括1和-1,你必须操作一次,让相邻两个元素由1变-1或由-1变1,问操作后数组总和最大多少思路暴力即可voidsolve(){ intn......
  • 2023.2.2 日寄
    距离放假还有\(\underline{~1~}\)天2023.2.2日寄一言\(~~~~\)“全国公民们,在三十五分钟后,我们的国家可能受到一次大规模核打击。加上第一批核弹头到达前所用的飞行......
  • 2.2
    java两种运行机制编译型和解释型两种区别:时机的不同()编译型:负责翻译的程序解释型:靠第三者的解释  java先编译再解释(都有).java——》.class(编译) IDEA......
  • FastJason 1.2.22-1.2.24 TemplatesImpl利用链分析
    前言休息了好像有一周了(慢慢的罪恶感),昨天在打比赛的时候做了一个php-cms的审计,然后激起了学习的热情。之前打比赛的时候遇到过fastjson的题,当时也就是直接用poc利用了,也......
  • 【Matlab学习2.3】矩阵求值
    方阵的行列式值把一个方阵看作一个行列式,并对其按行列式的规则求值,这个值就称为所对应的行列式的值。det(A):求方阵A所对应的行列式的值。 例2.3.1:验证det(A-1)=1/det(......