| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 199826 | GCSG01 | 早凉爱旅行2 | C++ | 运行出错 | 0 | 30 MS | 56524 KB | 2629 | 2025-11-22 12:47:30 |
#include<bits/stdc++.h> #define int long long using namespace std; const int N=2e5+5; int n; int x[N],y[N]; struct node{ int dis[3][3]; node(){dis[1][1]=dis[1][2]=dis[2][1]=dis[2][2]=INT_MAX;} }; namespace Line_Tree{ node tr[N<<2]; #define ls p<<1 #define rs p<<1|1 node Get_Min(node A,node B) { node s; for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) for(int k=1;k<=2;k++) s.dis[i][j]=min(A.dis[i][k]+B.dis[k][j],s.dis[i][j]); return s; } void build(int l,int r,int p) { if(l==r)return tr[p].dis[1][1]=1+abs(x[l]-x[l+1]), tr[p].dis[2][1]=1+abs(y[l]-l-1)+abs(l+1-x[l+1]), tr[p].dis[1][2]=1+abs(l+1-x[l])+abs(l+1-y[l+1]), tr[p].dis[2][2]=1+abs(y[l]-y[l+1]),void(); int mid=(l+r)>>1; build(l,mid,ls); build(mid+1,r,rs); tr[p]=Get_Min(tr[ls],tr[rs]); return ; } node query(int l,int r,int p,int ll,int rr) { if(ll<=l&&r<=rr)return tr[p]; int mid=(l+r)>>1; node A,B;A.dis[1][1]=-1,B.dis[1][1]=-1; if(ll<=mid)A=query(l,mid,ls,ll,rr); if(rr>mid)B=query(mid+1,r,rs,ll,rr); if(A.dis[1][1]==-1)return B; if(B.dis[1][1]==-1)return A; return Get_Min(query(l,mid,ls,ll,rr),query(mid+1,r,rs,ll,rr)); } void update(int l,int r,int p,int ll) { if(l==r)return tr[p].dis[1][1]=1+abs(x[l]-x[l+1]), tr[p].dis[2][1]=1+abs(y[l]-l-1)+abs(l+1-x[l+1]), tr[p].dis[1][2]=1+abs(l+1-x[l])+abs(l+1-y[l+1]), tr[p].dis[2][2]=1+abs(y[l]-y[l+1]),void(); int mid=(l+r)>>1; if(ll<=mid)update(l,mid,ls,ll); else update(mid+1,r,rs,ll); tr[p]=Get_Min(tr[ls],tr[rs]); return ; } } using Line_Tree::build; using Line_Tree::query; using Line_Tree::update; using Line_Tree::Get_Min; int get(int a,int b,int c,int d) {return abs(a-c)+abs(b-d);} signed main() { ios::sync_with_stdio(0);cin.tie(0); freopen("travel.in","r",stdin); freopen("travel.out","w",stdout); int m;cin>>n>>m; for(int i=1;i<n;i++)cin>>x[i]>>y[i]; build(1,n-1,1); while(m--) { int op,a,b,c,d;cin>>op>>a>>b>>c; if(op==1) { x[a]=b,y[a]=c,update(1,n-1,1,a-1); if(a!=n-1)update(1,n-1,1,a); } else { cin>>d; int l=max(a,b),r=max(c,d); if(l>r)swap(a,c),swap(b,d),swap(l,r); if(l==r)cout<<get(a,b,c,d)<<"\n"; else if(l+1==r) cout<<min(get(a,b,l,x[l])+1+get(r,x[l],c,d), get(a,b,y[l],l)+1+get(y[l],r,c,d))<<"\n"; else { node s; s.dis[1][1]=get(a,b,l,x[l]); s.dis[1][2]=get(a,b,y[l],l); s=Get_Min(s,query(1,n-1,1,l,r-2)); cout<<min(s.dis[1][1]+1+get(r,x[r-1],c,d), s.dis[1][2]+1+get(y[r-1],r,c,d))<<"\n"; } } } return 0; }