社区讨论
蒟蒻求助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 条回复,欢迎继续交流。
正在加载回复...