P4169 [Violet]天使玩偶/SJY摆棋子
Posted 2529102757ab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于P4169 [Violet]天使玩偶/SJY摆棋子的主要内容,如果未能解决你的问题,请参考以下文章