社区讨论

16tps 蒟蒻求助

P14255 列车(train)参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhizv2p1
此快照首次捕获于
2025/11/03 18:25
4 个月前
此快照最后确认于
2025/11/03 18:25
4 个月前
查看原帖
采用线段树二分,改了好几次都没对,只过了特殊性质B,C
其中desmax为可到最远点,desmin为可到最近点,res为最小票价,pmax为最大p值
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+3,inf=1e9+3;
int T,n,m,p[maxn];
inline int read(){
	int res=0;
	char c;c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9'){
		res=res*10+c-'0';
		c=getchar();
	}
	return res;
}
struct node{
	int desmax,desmin,res,pmax,lazy;
}t[maxn<<2];
void pushup(int u){
	t[u].res=min(t[u<<1].res,t[u<<1|1].res);
	t[u].desmax=max(t[u<<1].desmax,t[u<<1|1].desmax);
	t[u].desmin=min(t[u<<1].desmin,t[u<<1|1].desmin);
	t[u].pmax=max(t[u<<1].pmax,t[u<<1|1].pmax);
}
void pushdown(int u){
	if(t[u].lazy){
		int k=t[u].lazy;t[u].lazy=0;
		t[u<<1].lazy=max(t[u<<1].lazy,k),t[u<<1|1].lazy=max(t[u<<1|1].lazy,k);
		if(k>t[u<<1].desmax){
			t[u<<1].desmin=t[u<<1].desmax=k;
			t[u<<1].res=p[k]-t[u<<1].pmax;
		}
		if(k>t[u<<1|1].desmax){
			t[u<<1|1].desmin=t[u<<1|1].desmax=k;
			t[u<<1|1].res=p[k]-t[u<<1|1].pmax;
		}
	}
}
void build(int u,int l,int r){
	t[u].lazy=0;
	if(l==r){
		t[u].desmax=t[u].desmin=l+1;t[u].pmax=p[l];t[u].res=p[l+1]-p[l];
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);build(u<<1|1,mid+1,r);
	pushup(u);
}
void change(int u,int l,int r,int x,int y,int v){
	if(l>=x&&r<=y){
		if(v>t[u].desmax){
			t[u].desmin=t[u].desmax=v;
			t[u].res=p[v]-t[u].pmax;
		}
		t[u].lazy=max(t[u].lazy,v);
		return;
	}
	pushdown(u);
	int mid=l+r>>1;
	if(x<=mid)change(u<<1,l,mid,x,y,v);
	if(y>mid)change(u<<1|1,mid+1,r,x,y,v);
	pushup(u);
}
int find(int u,int l,int r,int x,int y,int border){
	if(l>y||r<x)return inf;
	if(l>=x&&r<=y){
		if(t[u].desmax<=border){
			return p[border]-t[u].pmax;
		}
		if(t[u].desmin<border){
			pushdown(u);
			int mid=l+r>>1;
			return min(find(u<<1,l,mid,x,y,border),find(u<<1|1,mid+1,r,x,y,border));
		}
		return t[u].res;
	}
	pushdown(u);
	int mid=l+r>>1,res=inf;
	if(x<=mid)res=min(res,find(u<<1,l,mid,x,y,border));
	if(y>mid)res=min(res,find(u<<1|1,mid+1,r,x,y,border));
	return res;
}
int main(){
	T=read();
	while(T--){
		n=read();m=read();
		for(int i=1;i<=n;i++){
			p[i]=read();
		}
		p[n+1]=inf+p[n];
		build(1,1,n);
		for(int i=1;i<=m;i++){
			int c,x,y;
			c=read();x=read();y=read();
			if(c==1){
				change(1,1,n,x,y,y+1);
			}
			else{
				if(x>=y){
					if(x==y)cout<<0<<endl;
					else cout<<-1<<endl;
					continue;
				}
				int ans=find(1,1,n,1,x,y);
				if(ans==inf)cout<<-1<<endl;
				else cout<<ans<<endl;
			}
		}
	}
	return 0;
}

回复

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

正在加载回复...