社区讨论
求调(玄关)
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 条回复,欢迎继续交流。
正在加载回复...