线段树求调,3ac,其余全wa
查看原帖
线段树求调,3ac,其余全wa
1071516
isop楼主2024/5/28 18:55
#include<bits/stdc++.h>
using namespace std;

const int N=5e5+10,INF=1e9;
int n,m;
int a[N],b[N];
struct node
{
	int maxA,minB,ab,ba,ans;
	// ij左,满足 i < j max(ai - bj) ;ij右满足 i < j max(aj - bi)
}tree[N<<2];

inline int read()
{
	int a=0,f=1;
	char c=getchar();
	while(!isdigit(c)) f=-1,c=getchar();
	while(isdigit(c)) a=(a<<3)+(a<<1)+(c^'0'),c=getchar();
	return a*f;
}

inline void write(int x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>=10) write(x/10);
	putchar(x%10+'0');
}

node pushup(node lc,node rc)
{
	node rt;//父节点
	rt.maxA=max(lc.maxA,rc.maxA);
	rt.minB=min(lc.minB,rc.minB);
	rt.ab=max(max(lc.ab,rc.ab),(lc.maxA-rc.minB));
	rt.ba=max(max(lc.ba,rc.ba),(rc.maxA-lc.minB));
	rt.ans=max(max(lc.ans,rc.ans),max(lc.ab+rc.maxA,lc.maxA+rc.ba));
	return rt;
}

void build(int u,int l,int r)
{
	if(l==r)
	{
		tree[u]={a[l],b[l],-INF,-INF,-INF};
		return;
	}
	int mid= l+r >> 1;
	build(u << 1,l,mid);
	build(u << 1 | 1,mid+1,r);//相当于<<1 再+1
	tree[u]=pushup(tree[u<<1],tree[u<<1 | 1]);
}

node query(int u,int l,int r,int fl,int fr)
{
	if(fl<=l && r<=fr) return tree[u];
	int mid=l+r >>1;
	if(fr<=mid) return query(u << 1,l,mid,fl,fr);
	else if(fl>mid) return query(u << 1 | 1,mid+1,r,fl,fr);
	else return pushup(query(u<<1,l,mid,fl,fr),query(u<<1 | 1,mid+1,r,fl,fr));
//	mid在fl、fr中间,分别取出左右两段,再合并为一个; 
}

void modify(int u,int l,int r,int x,int val1,int val2)
{
	if(l==r)
	{
		tree[u]={val1,val2,-INF,-INF,-INF};
		return;
	}
	int mid=l+r >> 1;
	if(x<=mid) modify(u<<1,l,mid,x,val1,val2);
	else modify(u<<1 | 1,mid+1,r,x,val1,val2);
	tree[u]=pushup(tree[u<<1],tree[u<<1 | 1]);
}

int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=n;i++) b[i]=read();
	build(1,1,n);
	int opt,x,y;
	while(m--)
	{
		opt=read(),x=read(),y=read();
		if(opt==1) a[x]=y,modify(1,1,n,x,a[x],b[x]);//区间向上合并 
		else if(opt==2) b[x]=y,modify(1,1,n,x,a[x],b[x]);
		else write(query(1,1,n,x,y).ans),printf("\n");
	}
	return 0;
}
2024/5/28 18:55
加载中...