*玄关*线段树马风很好求调!!!
查看原帖
*玄关*线段树马风很好求调!!!
1399216
_Gloaming_楼主2024/8/14 10:57
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,inf=-1e9; 
#define ll long long
int n,m,a[N],b[N];
struct node
{
    int l,r;
    int maxn,minn,mab,mba,ans;
}t[N*4];
node up(node a,node b)//左儿子与右儿子
{
    cout<<0<<" "<<a.l<<" "<<b.r<<" "<<"\n";
    node f;
    f.minn=min(a.minn,b.minn);
    f.maxn=max(a.maxn,b.maxn);
    f.mab=max(max(a.mab,b.mab),a.maxn-b.minn);//!!!
    f.mba=max(max(a.mba,b.mba),b.maxn-a.minn);//!!!
    f.ans=max(max(a.ans,b.ans),max(f.mab+b.maxn,f.mba+a.maxn));
    return f;
}
void build(int k,int l,int r)
{
    //cout<<1<<" "<<k<<" "<<x<<" "<<y<<" "<<"\n";
    t[k].l=l,t[k].r=r;
    if(l==r)
    {
        t[k].ans=t[k].mab=t[k].mba=inf;
        t[k].minn=b[l];
        t[k].maxn=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    t[k]=up(t[k<<1],t[k<<1|1]);
    return;
}
void change1(int k,int x,int y)
{
    cout<<1<<" "<<k<<" "<<x<<" "<<y<<" "<<"\n";
    if(t[k].l==t[k].r)
    {
        t[k].maxn=y;
        return;
    }
    int mid=t[k].l+t[k].r>>1;
    if(x<=mid)
        change1(k<<1,x,y);
    else
        change1(k<<1|1,x,y);
    t[k]=up(t[k<<1],t[k<<1|1]);
}
void change2(int k,int x,int y)
{
    cout<<2<<" "<<k<<" "<<x<<" "<<y<<" "<<"\n";
    if(t[k].l==t[k].r)
    {
        t[k].minn=y;
        return;
    }
    int mid=t[k].l+t[k].r>>1;
    if(x<=mid)
        change2(k<<1,x,y);
    else
        change2(k<<1|1,x,y);
    t[k]=up(t[k<<1],t[k<<1|1]);
}
ll ask(int k,int x,int y)
{
    cout<<3<<" "<<k<<" "<<t[k].l<<" "<<t[k].r<<"\n";
    if(x<=t[k].l && t[k].r<=y)
    {
        return t[k].ans;
    }
    int mid=(t[k].l+t[k].r)>>1;
    ll res=0;
    if(y<=mid)
        res+=ask(k<<1,x,y);
    if(mid<x)
        res+=ask(k<<1|1,x,y);
    return res;
}

int main()
{
	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);
    while(m--)
    {
        int op,x,y;
        cin>>op>>x>>y;
        if(op==1)
            change1(1,x,y);
        else if(op==2)
            change2(1,x,y);
        else if(op==3)
            cout<<ask(1,x,y)<<"\n";
    }
	return 0;
}
/*
6 6
1 4 2 3 5 6
5 3 4 1 6 7
3 2 5
3 1 6
1 2 3
3 1 6
2 6 1
3 1 6*/

rt 报错Segmetation fault

2024/8/14 10:57
加载中...