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