P4169 [Violet]天使玩偶/SJY摆棋子
1 // luogu-judger-enable-o2 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 const int maxn=1e7+10; 6 const int inf=2e7+7; 7 struct node 8 { 9 int x,y,id,ans,time; 10 }a[maxn],b[maxn],tt[maxn];; 11 int flag; 12 int len,x,y; 13 int n,q; 14 struct XX 15 { 16 int c[maxn]; 17 int lowbit(int x) 18 { 19 return x&(-x); 20 } 21 void update(int x,int w) 22 { 23 for(;x<=len;x+=lowbit(x)) 24 { 25 c[x]=max(w,c[x]); 26 } 27 } 28 int sum(int x) 29 { 30 int res=0; 31 for(;x;x-=lowbit(x)) 32 { 33 res=max(res,c[x]); 34 } 35 if(res) 36 { 37 return res; 38 } 39 else 40 return -inf; 41 } 42 void clear(int x) 43 { 44 for(;c[x];x+=lowbit(x)) 45 { 46 c[x]=0; 47 } 48 } 49 }XX; 50 void CDQ(int l,int r) 51 { 52 if(l == r) return; 53 int mid =(l+r)>>1; 54 CDQ (l,mid); 55 CDQ(mid+1,r); 56 int t1=l; 57 int t2=mid+1; 58 int k=l; 59 while(t2<=r) 60 { 61 while(t1<=mid&&b[t1].x<=b[t2].x) 62 { 63 if(b[t1].time==1) 64 { 65 XX.update(b[t1].y,b[t1].x+b[t1].y); 66 } 67 tt[k++]=b[t1++]; 68 } 69 if(b[t2].time==2) 70 { 71 a[b[t2].id].ans=min(a[b[t2].id].ans,b[t2].x+b[t2].y-XX.sum(b[t2].y)); 72 } 73 tt[k++]=b[t2++]; 74 } 75 for(int i=l;i<=t1-1;i++) 76 { 77 if(b[i].time==1) 78 { 79 XX.clear(b[i].y); 80 } 81 } 82 83 while(t1<=mid) 84 { 85 tt[k++]=b[t1++]; 86 } 87 for(int i=l;i<=r;i++) 88 { 89 b[i]=tt[i]; 90 } 91 } 92 void solve(int x1,int y1) 93 { 94 for(int i=1;i<=n+q;i++) 95 { 96 b[i]=a[i]; 97 if(x1) 98 { 99 b[i].x=len-b[i].x; 100 } 101 if(y1) 102 { 103 b[i].y=len-b[i].y; 104 } 105 } 106 CDQ(1,n+q); 107 } 108 int main() 109 { 110 scanf("%d%d",&n,&q); 111 for(int i=1;i<=n;i++) 112 { 113 scanf("%d%d",&x,&y); 114 a[i].time=1; 115 a[i].id=i; 116 a[i].x=++x; 117 a[i].y=++y; 118 len=max(len,max(x,y)); 119 } 120 for(int i=n+1;i<=n+q;i++) 121 { 122 scanf("%d%d%d",&flag,&x,&y); 123 a[i].time=flag; 124 a[i].id=i; 125 a[i].x=++x; 126 a[i].y=++y; 127 a[i].ans=inf; 128 len=max(len,max(x,y)); 129 } 130 len++; 131 solve(0,0); 132 solve(0,1); 133 solve(1,0); 134 solve(1,1); 135 for(int i=n+1;i<=n+q;i++) 136 { 137 if(a[i].time ==2) 138 { 139 printf("%d\n",a[i].ans); 140 } 141 } 142 return 0; 143 }