社区讨论

88pts求调

P14255 列车(train)参与者 2已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mhj0ts7k
此快照首次捕获于
2025/11/03 18:52
4 个月前
此快照最后确认于
2025/11/03 18:52
4 个月前
查看原帖
rt,最后3个点TLE,如果不在线段树上二分影响大吗?不想过多修改
CPP
#include<bits/stdc++.h>
#define int long long
#define mp make_pair
#define fi first
#define se second
#define lb lower_bound
#define fr front()
#define pii pair<int,int>
#define INF 1145141919ll
using namespace std;

int t,n,m,p[100005];

int cnt=0;

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;
}
void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}


struct segtree{
    int a[500005],dis[500005],lz[500005];
    inline void push_down(int k,int l,int r){
        if(lz[k]==0)return;
        int mid=(l+r)/2;
        a[2*k]=max(a[2*k],lz[k]);
        a[2*k+1]=max(a[2*k+1],lz[k]);
        dis[2*k]=max(dis[2*k],p[lz[k]]-p[mid]);
        dis[2*k+1]=max(dis[2*k+1],p[lz[k]]-p[r]);
        lz[2*k]=max(lz[2*k],lz[k]);
        lz[2*k+1]=max(lz[2*k+1],lz[k]);lz[k]=0;
    }
    inline void change(int k,int l,int r,int ql,int qr,int num){
        if(ql<=l&&qr>=r){
            a[k]=max(a[k],num);lz[k]=max(lz[k],num);
            dis[k]=max(dis[k],p[num]-p[r]);return;
        }
        int mid=(l+r)/2;push_down(k,l,r);
        if(ql<=mid)change(2*k,l,mid,ql,qr,num);
        if(qr>mid)change(2*k+1,mid+1,r,ql,qr,num);
        a[k]=max(a[2*k],a[2*k+1]);
        dis[k]=min(dis[2*k],dis[2*k+1]);
    }
    inline int query1(int k,int l,int r,int ql,int qr){
        if(ql<=l&&qr>=r)return a[k];
        int mid=(l+r)/2,res=0;push_down(k,l,r);
        if(ql<=mid)res=max(res,query1(2*k,l,mid,ql,qr));
        if(qr>mid)res=max(res,query1(2*k+1,mid+1,r,ql,qr));
        dis[k]=min(dis[2*k],dis[2*k+1]);
        return res;
    }
    inline int query2(int k,int l,int r,int ql,int qr){
        if(ql<=l&&qr>=r)return dis[k];
        int mid=(l+r)/2,res=3*INF;push_down(k,l,r);
        if(ql<=mid)res=min(res,query2(2*k,l,mid,ql,qr));
        if(qr>mid)res=min(res,query2(2*k+1,mid+1,r,ql,qr));
        dis[k]=min(dis[2*k],dis[2*k+1]);
        return res;
    }
}tr;

inline void solve(int L,int R){
    cnt++;
    int l=1,r=L,mid,ans=0,res=INF;
    while(1){
        if(l>r)break;
        int mid=(l+r)/2;
        if(tr.query1(1,1,n,mid,mid)<=R)l=mid+1,ans=mid;
        else r=mid-1;
    }
    if(ans>=1)res=min(res,p[R]-p[ans]);
    if(ans<L)res=min(res,tr.query2(1,1,n,ans+1,L));
    if(res>=INF){write(-1);putchar('\n');return;}
    //cout<<res<<"\n";
    write(res);putchar('\n');
}

inline void update(int L,int R){
    int l=L,r=R,mid,ans=0;
    while(1){
        if(l>r)break;
        int mid=(l+r)/2;
        if(tr.query1(1,1,n,mid,mid)<=R+1)l=mid+1,ans=mid;
        else r=mid-1;
    }
    if(ans>=L)tr.change(1,1,n,L,ans,R+1);
}

signed main(){
    //ios::sync_with_stdio(false);
    //cin>>t;
    t=read();
    while(t--){
        //cin>>n>>m;
        n=read();m=read();
        p[n+1]=3*INF;
        for(int i=1;i<=n;i++){
            //cin>>p[i];
            p[i]=read();
        }
        for(int i=1;i<=n;i++)tr.change(1,1,n,i,i,i+1);
        while(m--){
            int op,l,r;
            //cin>>op>>l>>r;
            op=read();l=read();r=read();
            if(op==1)update(l,r);
            if(op==2)solve(l,r);
        }
        for(int i=1;i<=4*n;i++){
            tr.a[i]=0;tr.dis[i]=0;tr.lz[i]=0;
        }
    }
}

回复

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

正在加载回复...