社区讨论

蒟蒻求助0pts全RE求调(必关)!

P7706「Wdsr-2.7」文文的摄影布置参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjawsh3
此快照首次捕获于
2025/11/03 23:34
4 个月前
此快照最后确认于
2025/11/03 23:34
4 个月前
查看原帖
CPP
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=500005;
int a[maxn],b[maxn];
struct Tree
{
	int ans;
	int maxa,minb;
	int lm,rm;
	int l,r;
}tr[maxn*4];
void push_up(int id)
{
	Tree x=tr[id*2],y=tr[id*2+1];
	tr[id].maxa=max(x.maxa,y.maxa);
	tr[id].minb=min(x.minb,y.minb);
	tr[id].lm=max(max(x.lm,y.lm),x.maxa-y.minb);
	tr[id].rm=max(max(x.rm,y.rm),y.maxa-x.minb);
	tr[id].ans=max(max(x.ans,y.ans),max(x.lm+y.maxa,x.maxa+y.rm));
}
void build(int id,int l,int r)
{
	tr[id].l=l;
	tr[id].r=r;
	if(l==r)
	{
		tr[id].maxa=a[l];
		tr[id].minb=b[l];
		tr[id].ans=tr[id].lm=tr[id].rm=-0x3f3f3f3f;
		return ;
	}
	int mid=(l+r)>>1;
	build(mid*2,l,mid);
	build(mid*2+1,mid+1,r);
	push_up(id);
}
void change(int id,int x,int val,int op)
{
	if(tr[id].l==tr[id].r)
	{
		if(op==1)
		{
			tr[id].maxa=val;
		}
		else
		{
			tr[id].minb=val;
		}
		return ;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	if(x<=mid)
	{
		change(id*2,x,val,op);
	}
	else
	{
		change(id*2+1,x,val,op);
	}
	push_up(id);
}
Tree chuli(Tree x,Tree y)
{
	Tree t;
	t.maxa=max(x.maxa,y.maxa);
	t.minb=min(x.minb,y.minb);
	t.lm=max(max(x.lm,y.lm),x.maxa-y.minb);
	t.rm=max(max(x.rm,y.rm),y.maxa-x.minb);
	t.ans=max(max(x.ans,y.ans),max(x.lm+y.maxa,x.maxa+y.rm));
	return t;
}
Tree find(int id,int x,int y)
{
	if(x<=tr[id].l&&tr[id].r<=y)
	{
		return tr[id];
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	if(y<=mid)
	{
		return find(id*2,x,y);
	}
	else if(mid<x)
	{
		return find(id*2+1,x,y);
	}
	else
	{
		return chuli(find(id*2,x,y),find(id*2+1,x,y));
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin >> n >> m;
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];
	}
	for(int i=1;i<=n;i++)
	{
		cin >> b[i];
	}
	build(1,1,n);
//	for(int i=1;i<=2*n;i++)
//	{
//		cout << tr[i].maxa << ' ';
//	}
//	cout << '\n';
//	for(int i=1;i<=2*n;i++)
//	{
//		cout << tr[i].minb << ' ';
//	}
//	cout << '\n';
//	for(int i=1;i<=2*n;i++)
//	{
//		cout << tr[i].ans << ' ';
//	}
//	cout << '\n';
//	for(int i=1;i<=2*n;i++)
//	{
//		cout << tr[i].lm << ' ';
//	}
//	cout << '\n';
//	for(int i=1;i<=2*n;i++)
//	{
//		cout << tr[i].rm << ' ';
//	}
	int op,x,y;
	for(int i=1;i<=m;i++)
	{
		cin >> op >> x >> y;
		if(op==1||op==2)
		{
			change(1,x,y,op);
		}
		else
		{
			cout << find(1,x,y).ans << '\n';
		}
	}
	return 0;
}
问题疑似在build()或push_up()上,但重写了好几遍就是不对。

回复

1 条回复,欢迎继续交流。

正在加载回复...