社区讨论

求调(玄关)

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mhj10z2c
此快照首次捕获于
2025/11/03 18:58
4 个月前
此快照最后确认于
2025/11/03 18:58
4 个月前
查看原帖
rt
CPP
#include<bits/stdc++.h>
using namespace std;
namespace IO{
    template<typename T>inline void read(T&x){
        char c=getchar();bool f=0;x=0;
        while(!isdigit(c)) c=='-'?f=1:0,c=getchar();
        while(isdigit(c)) x=x*10+c-'0',c=getchar();f?x=-x:0;
    }
    template<typename T>inline void write(T x){
        if(x==0){putchar('0');return ;}
        x<0?putchar('-'),x=-x:0;
        short st[100],top=0;
        while(x) st[++top]=x%10,x/=10;
        while(top) putchar(st[top--]+'0');
    }
    inline void read(char&x){x=getchar();while(isspace(x)) x=getchar();}
    inline void write(char x){putchar(x);}
    inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}
    inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}
    template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}
    template<typename T,typename...T2>inline void read(T&x,T2&...y){read(x),read(y...);}
    template<typename T,typename...T2>inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
const int maxn=100010,inf=1000000010;
int n,m,p[maxn];
class Segment_Tree{
private:
	struct node{int lan,maxx,minx,l,r;node(){lan=-1,minx=0,maxx=inf;}}t[maxn*16];
	void down(int u){
		if(t[u].lan==-1) return ;
		t[u].maxx=min(t[u].maxx,t[u].lan);
		t[u].minx=max(t[u].minx,p[t[u].l]-p[t[u].lan]);
		if(t[u<<1].lan==-1) t[u<<1].lan=t[u].lan;
		t[u<<1].lan=min(t[u<<1].lan,t[u].lan);
		if(t[u<<1|1].lan==-1) t[u<<1|1].lan=t[u].lan;
		t[u<<1|1].lan=min(t[u<<1|1].lan,t[u].lan);
		// if(u==6) write(t[u].minx,t[u].lan,"!!!!!!!!!!!!!!!!!!!!!!!!!");
		t[u].lan=-1;
	}
	void up(int u,int l,int r,int ll,int rr,int z){
		t[u].l=l,t[u].r=r;
		down(u);
		if(l>rr||r<ll) return ;
		if(ll<=l&&r<=rr){
			t[u].lan=z;
			// if(z==0) write(u,l,r,"!!");
			down(u);
			return ;
		}
		int mid=l+r>>1;
		up(u<<1,l,mid,ll,rr,z),up(u<<1|1,mid+1,r,ll,rr,z);
		t[u].maxx=max(t[u<<1].maxx,t[u<<1|1].maxx);
		t[u].minx=min(t[u<<1].minx,t[u<<1|1].minx);
	}
	int query(int u,int l,int r,int z){
		down(u);
		if(l==r) return l;
		int mid=l+r>>1;
		down(u<<1),down(u<<1|1);
		int ans;
		if(t[u<<1].maxx>=z) ans=query(u<<1,l,mid,z);
		else ans=query(u<<1|1,mid+1,r,z);
		t[u].maxx=max(t[u<<1].maxx,t[u<<1|1].maxx);
		t[u].minx=min(t[u<<1].minx,t[u<<1|1].minx);
		return ans;
	}
	int query2(int u,int l,int r,int z){
		down(u);
		if(l==r) return l;
		int mid=l+r>>1;
		down(u<<1),down(u<<1|1);
		int ans;
		if(t[u<<1].maxx>z) ans=query2(u<<1,l,mid,z);
		else ans=query2(u<<1|1,mid+1,r,z);
		t[u].maxx=max(t[u<<1].maxx,t[u<<1|1].maxx);
		t[u].minx=min(t[u<<1].minx,t[u<<1|1].minx);
		return ans;
	}
	int query(int u,int l,int r,int ll,int rr){
		// write(u,l,r,t[u].minx,t[u].lan,"??!");
		down(u);
		if(ll>rr) return inf;
		if(l>rr||r<ll) return inf;
		// write(u,l,r,t[u].minx,"??");
		if(ll<=l&&r<=rr) return /*write(u,l,r,t[u].minx,"!!"),*/t[u].minx;
		// if(l==r) return /*write(u,l,r,t[u].minx,"!!"),*/t[u].minx;
		int mid=l+r>>1;
		int ans=min(query(u<<1,l,mid,ll,rr),query(u<<1|1,mid+1,r,ll,rr));
		t[u].maxx=max(t[u<<1].maxx,t[u<<1|1].maxx);
		t[u].minx=min(t[u<<1].minx,t[u<<1|1].minx);
		return ans;
	}
public:
	void up(int l,int r,int z){up(1,0,n+1,l,r,z);}
	int query(int l,int r){
		// int w=10;
		int w=max(r,query(1,0,n+1,l));
		// write(r,w-1,query(1,0,n+1,r,w-1),"!!!");
		int ans=min(p[w]-p[l],query(1,0,n+1,r,w-1));
		// write(p[w]-p[l],"!!!!");
		return ans>p[n]-p[1]?-1:ans;
	}
	void up(int l,int r){
		int w=max(query2(1,0,n+1,l-1),l);
		up(w,r,l-1);
	}
	void clear(){for(int i=0;i<8*maxn;i++) t[i]=node();}
}t;
void solve(){
	t.clear();
	read(n,m);
	for(int i=1;i<=n;i++) read(p[i]),t.up(i,i,i);
	t.up(0,0,0),p[0]=-inf;
	t.up(n+1,n+1,n+1),p[n+1]=inf;
	for(int i=1;i<=m;i++){
		int op,x,y;
		read(op,x,y);
		if(op==1){
			if(x==y) continue;
			t.up(x,y);
			continue;
		}
		write(t.query(x,y));
		write('\n');
	}
}
signed main(){
	int T;
	read(T);
	while(T--) solve();
    return 0;
}

回复

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

正在加载回复...