Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
98098 猫猫 早凉爱旅行2 C++ 解答错误 0 1000 MS 5212 KB 2858 2023-08-14 12:17:45

Tests(0/7):


//喵的,打完才发现看错题了,就这样吧 #include<cstdio> #include<vector> #include<algorithm> using namespace std; typedef long long ll; inline ll read(){ ll x=0; int f=0,ch=0; while(ch<48||ch>57) f=(ch=='-'),ch=getchar(); while(ch>47&&ch<58) x=(x<<3)+(x<<1)+(ch&15),ch=getchar(); return f?-x:x; } inline void write(ll x,char end='\n'){ if(x==0){ putchar('0'); putchar(end); return; } if(x<0) putchar('-'),x=-x; int ch[70]={0},cnt=0; while(x){ ch[cnt++]=(int)(x%10); x/=10; } while(cnt--) putchar(ch[cnt]+48); putchar(end); } const int N=2e5+5; int n,m; vector<int> sx,sy; int xsize,ysize; inline int upperx(int x){ int l=0,r=xsize; while(l<r){ int mid=(l+r)>>1; if(sx[mid]>=x) r=mid; else l=mid+1; } return l; } inline int uppery(int y){ int l=0,r=ysize; while(l<r){ int mid=(l+r)>>1; if(sy[mid]>=y) r=mid; else l=mid+1; } return l; } inline int findx(int x){ int l=0,r=xsize-1; while(l<r){ int mid=(l+r)>>1; if(sx[mid]>=x) r=mid; else l=mid+1; } return l; } inline int findy(int y){ int l=0,r=ysize-1; while(l<r){ int mid=(l+r)>>1; if(sy[mid]>=y) r=mid; else l=mid+1; } return l; } inline void insertx(int x){ int pos=upperx(x); sx.insert(sx.begin()+pos,x); ++xsize; } inline void inserty(int y){ int pos=uppery(y); sy.insert(sy.begin()+pos,y); ++ysize; } inline void delx(int x){ int pos=findx(x); sx.erase(sx.begin()+pos); --xsize; } inline void dely(int y){ int pos=findy(y); sy.erase(sy.begin()+pos); --ysize; } inline int lowerx(int x){ int l=0,r=xsize-1; while(l<r){ int mid=(l+r+1)>>1; if(sx[mid]<=x) l=mid; else r=mid-1; } return l; } inline int lowery(int y){ int l=0,r=ysize-1; while(l<r){ int mid=(l+r+1)>>1; if(sy[mid]<=y) l=mid; else r=mid-1; } return l; } inline int findnearx(int b,int d){ if(b>d){ return sx[lowerx(d)]; } int pos1=sx[lowerx(d)]; int pos2=sx[upperx(b)]; if(pos2>d) return pos1; if(abs(b-pos1)<abs(b-pos2)) return pos1; else return pos2; } inline int findneary(int a,int c){ if(a>c){ return sy[lowery(c)]; } int pos1=sy[lowery(c)]; int pos2=sy[uppery(a)]; if(pos2>c) return pos1; if(abs(a-pos1)<abs(a-pos2)) return pos1; else return pos2; } int x[N],y[N]; int main(){ n=read(),m=read(); for(int i=1;i<n;++i){ x[i]=read();y[i]=read(); insertx(x[i]); inserty(y[i]); } int a,b,c,d; while(m--){ int op=read(); a=read(),b=read(),c=read(); if(op==1){ delx(x[a]); dely(y[a]); insertx(b); inserty(c); x[a]=b; y[a]=c; } else{ d=read(); int posx=findnearx(b,d); int posy=findneary(a,c); int ans=min(abs(b-posx)+abs(a-c)+abs(d-posx),abs(a-posy)+abs(b-d)+abs(c-posy)); write(ans); } } return 0; }


测评信息: