提交时间:2023-08-14 15:34:23

运行 ID: 98345

/* 参考代码 #include<bits/stdc++.h> #define ll long long // ll偷懒 using namespace std; // 读写优化 int read(){ int x; char c; while((c = getchar()) < '0' || c > '9'); x = c - 48; while((c = getchar()) >= '0' && c <= '9') x = x * 10 - 48 + c; return x; } void write(int x){ if(x > 9) write(x / 10); putchar(x % 10 + 48); } // 结构A struct A{ ll a, b; A() // 成员函数?还是构造? { a = b = 0; } A(ll _a,ll _b) { a = _a; b = _b; } }; // 结构B struct B{ ll aa, ab, ba, bb; // 成员变量 B() // 自己返回类型的函数? { aa = ab = ba = bb = 0; } B(ll _aa,ll _ab,ll _ba,ll _bb) { aa = _aa; ab = _ab; ba = _ba; bb = _bb; } }; A AB(A x,B y){return A(min(x.a+y.aa,x.b+y.ba),min(x.a+y.ab,x.b+y.bb));} B BB(B x,B y){return B(min(x.aa+y.aa,x.ab+y.ba),min(x.aa+y.ab,x.ab+y.bb),min(x.ba+y.aa,x.bb+y.ba),min(x.ba+y.ab,x.bb+y.bb));} // 构造矩阵,还是合并矩阵的两个函数? // 开始引入全局变量 const int maxn=200020; int x[maxn],y[maxn]; B num[maxn<<2]; // 返回B类型的数据处理,应该也是给矩阵用的 B workget(int id,int x,int y,int tx,int ty){return B(abs(x-tx)+1,id+id+1+1-x-ty+1,id+id+1+1-y-tx+1,abs(y-ty)+1);} // 这里应该是构造线段树 void init(int p,int l,int r){ if(l==r){num[p]=workget(l,x[l],y[l],x[l+1],y[l+1]);return;} int mid=(l+r)/2; init(2*p,l,mid);init(2*p+1,mid+1,r); num[p]=BB(num[2*p],num[2*p+1]); } void change(int p,int l,int r,int t){ if(l==r){num[p]=workget(l,x[l],y[l],x[l+1],y[l+1]);return;} int mid=(l+r)/2; if(t<=mid)change(2*p,l,mid,t); else change(2*p+1,mid+1,r,t); num[p]=BB(num[2*p],num[2*p+1]); } void check(int p,int l,int r,int L,int R,A &t){ if(L<=l&&r<=R){t=AB(t,num[p]);return;} int mid=(l+r)/2; if(L<=mid)check(2*p,l,mid,L,R,t); if(mid<R)check(2*p+1,mid+1,r,L,R,t); } // 进入主程序 int main(){ int n=read(),m=n-2,q=read(),op,ta,tb,tc,td,va,vb; for(int i=1;i<n;i++) x[i]=read(),y[i]=read(); // 读入 init(1,1,m); // 构造 A tmp;ll ans,kr; // 数据容器 while(q--){ // 大循环,确实省去了for初始化的时间,但不是最紧要的 op=read(); // 动作类型读入 if(op==1){ ta=read();tb=read();tc=read(); x[ta]=tb;y[ta]=tc; if(ta!=1)change(1,1,m,ta-1); // 来了,数据类型的应用 if(ta!=n-1)change(1,1,m,ta); } else{ ta=read();tb=read();tc=read();td=read(); if((va=max(ta,tb))>(vb=max(tc,td)))swap(ta,tc),swap(tb,td),swap(va,vb); // 数据处理,写的都很密,说明了语言和模版熟练的重要性 if(va==vb){ if(ta==va&&tc==vb)printf("%d\n",abs(td-tb)); // 特判 else if(tb==va&&td==vb)printf("%d\n",abs(ta-tc)); else printf("%d\n",abs(va+vb-min(ta,tb)-min(tc,td))); } else if(va+1==vb){ kr=ans=1; if(ta==va)kr+=abs(tb-x[va]),ans+=va+va-y[va]-tb; else kr+=va+va-x[va]-ta,ans+=abs(ta-y[va]); if(tc==vb)kr+=abs(td-x[va]),ans+=vb+vb-y[va]-td; else kr+=vb+vb-x[va]-tc,ans+=abs(tc-y[va]); printf("%lld\n",min(kr,ans)); } else{ tmp.a=tmp.b=0; if(ta==va)tmp.a+=abs(tb-x[va]),tmp.b+=va+va-y[va]-tb; else tmp.a+=va+va-x[va]-ta,tmp.b+=abs(ta-y[va]); check(1,1,m,va,vb-2,tmp); tmp.a++;tmp.b++; if(tc==vb)tmp.a+=abs(x[vb-1]-td),tmp.b+=vb+vb-td-y[vb-1]; else tmp.a+=vb+vb-tc-x[vb-1],tmp.b+=abs(y[vb-1]-tc); printf("%lld\n",min(tmp.a,tmp.b)); } // 连续的分支处理,主要利用结构体和数组以及模拟出来的数据结构,值得深思 } } return 0; } */