1. 程式人生 > >ACM-ICPC 2018 瀋陽賽區現場賽 E. The Kouga Ninja Scrolls 切比雪夫距離 + 線段樹

ACM-ICPC 2018 瀋陽賽區現場賽 E. The Kouga Ninja Scrolls 切比雪夫距離 + 線段樹

題目連結:

題意:在二維平面上有 n 個人,每個人有一個位置(xi, yi)和門派 ci,m 個操作:①改變第 k 個人的位置;②改變第 k 個人的門派;③詢問區間[l,r]之間不同門派的兩個人的最大曼哈頓距離。

題解:首先需要將曼哈頓距離轉化成切比雪夫距離(不懂戳https://www.cnblogs.com/zwfymqz/p/8253530.html),然後用線段樹維護一個區間內兩個不同門派 x 和 y 的最大最小和次大次小值即可。(維護次大/次小值是因為若區間內的最大值和最小值的人是同一個門派的話則不能進行比較)(程式碼寫的很醜,建議理解做法後自己寫一個...

 

  1 #include <bits/stdc++.h>
  2
using namespace std; 3 #define ll long long 4 #define ull unsigned long long 5 #define mst(a,b) memset((a),(b),sizeof(a)) 6 #define mp(a,b) make_pair(a,b) 7 #define pi acos(-1) 8 #define pii pair<int,int> 9 #define pb push_back 10 #define fi first 11 #define se second 12 const
int INF = 0x3f3f3f3f; 13 const double eps = 1e-6; 14 const int MAXN = 1e5 + 10; 15 const int MAXM = 1e7 + 10; 16 const ll mod = 1e9 + 7; 17 18 ll x[MAXN],y[MAXN]; 19 int c[MAXN]; 20 21 struct node { 22 pair<ll,int> mxx[2], mnx[2]; 23 pair<ll,int> mxy[2], mny[2]; 24 }st[MAXN<<2
]; 25 26 void pushup(int rt) { 27 st[rt] = st[rt<<1]; 28 if(st[rt].mxx[0].se == -1) st[rt].mxx[0] = st[rt<<1|1].mxx[0], st[rt].mxx[1] = st[rt<<1|1].mxx[1]; 29 else if(st[rt<<1|1].mxx[0] >= st[rt].mxx[0]) { 30 if(st[rt<<1|1].mxx[0].se != st[rt].mxx[0].se) { 31 st[rt].mxx[1] = st[rt].mxx[0], st[rt].mxx[0] = st[rt<<1|1].mxx[0]; 32 if(st[rt<<1|1].mxx[1].se != -1 && st[rt<<1|1].mxx[1].se != st[rt].mxx[0].se && st[rt<<1|1].mxx[1].fi >= st[rt].mxx[1].fi) 33 st[rt].mxx[1] = st[rt<<1|1].mxx[1]; 34 } else { 35 st[rt].mxx[0] = st[rt<<1|1].mxx[0]; 36 if(st[rt<<1|1].mxx[1].se != -1 && st[rt<<1|1].mxx[1].se != st[rt].mxx[0].se && st[rt<<1|1].mxx[1].fi >= st[rt].mxx[1].fi) 37 st[rt].mxx[1] = st[rt<<1|1].mxx[1]; 38 } 39 } else { 40 if(st[rt<<1|1].mxx[0].se != st[rt].mxx[0].se && st[rt<<1|1].mxx[0].fi >= st[rt].mxx[1].fi) 41 st[rt].mxx[1] = st[rt<<1|1].mxx[0]; 42 else if(st[rt<<1|1].mxx[1].se != -1 && st[rt<<1|1].mxx[1].se != st[rt].mxx[0].se && st[rt<<1|1].mxx[1].fi >= st[rt].mxx[1].fi) 43 st[rt].mxx[1] = st[rt<<1|1].mxx[1]; 44 } 45 //mnx 46 if(st[rt].mnx[0].se == -1) st[rt].mnx[0] = st[rt<<1|1].mnx[0], st[rt].mnx[1] = st[rt<<1|1].mnx[1]; 47 else if(st[rt<<1|1].mnx[0] <= st[rt].mnx[0]) { 48 if(st[rt<<1|1].mnx[0].se != st[rt].mnx[0].se) { 49 st[rt].mnx[1] = st[rt].mnx[0], st[rt].mnx[0] = st[rt<<1|1].mnx[0]; 50 if(st[rt<<1|1].mnx[1].se != -1 && st[rt<<1|1].mnx[1].se != st[rt].mnx[0].se && st[rt<<1|1].mnx[1].fi <= st[rt].mnx[1].fi) 51 st[rt].mnx[1] = st[rt<<1|1].mnx[1]; 52 } else { 53 st[rt].mnx[0] = st[rt<<1|1].mnx[0]; 54 if(st[rt<<1|1].mnx[1].se != -1 && st[rt<<1|1].mnx[1].se != st[rt].mnx[0].se && st[rt<<1|1].mnx[1].fi <= st[rt].mnx[1].fi) 55 st[rt].mnx[1] = st[rt<<1|1].mnx[1]; 56 } 57 } else { 58 if(st[rt<<1|1].mnx[0].se != st[rt].mnx[0].se && st[rt<<1|1].mnx[0].fi <= st[rt].mnx[1].fi) 59 st[rt].mnx[1] = st[rt<<1|1].mnx[0]; 60 else if(st[rt<<1|1].mnx[1].se != -1 && st[rt<<1|1].mnx[1].se != st[rt].mnx[0].se && st[rt<<1|1].mnx[1].fi <= st[rt].mnx[1].fi) 61 st[rt].mnx[1] = st[rt<<1|1].mnx[1]; 62 } 63 //mxy 64 if(st[rt].mxy[0].se == -1) st[rt].mxy[0] = st[rt<<1|1].mxy[0], st[rt].mxy[1] = st[rt<<1|1].mxy[1]; 65 else if(st[rt<<1|1].mxy[0] >= st[rt].mxy[0]) { 66 if(st[rt<<1|1].mxy[0].se != st[rt].mxy[0].se) { 67 st[rt].mxy[1] = st[rt].mxy[0], st[rt].mxy[0] = st[rt<<1|1].mxy[0]; 68 if(st[rt<<1|1].mxy[1].se != -1 && st[rt<<1|1].mxy[1].se != st[rt].mxy[0].se && st[rt<<1|1].mxy[1].fi >= st[rt].mxy[1].fi) 69 st[rt].mxy[1] = st[rt<<1|1].mxy[1]; 70 } else { 71 st[rt].mxy[0] = st[rt<<1|1].mxy[0]; 72 if(st[rt<<1|1].mxy[1].se != -1 && st[rt<<1|1].mxy[1].se != st[rt].mxy[0].se && st[rt<<1|1].mxy[1].fi >= st[rt].mxy[1].fi) 73 st[rt].mxy[1] = st[rt<<1|1].mxy[1]; 74 } 75 } else { 76 if(st[rt<<1|1].mxy[0].se != st[rt].mxy[0].se && st[rt<<1|1].mxy[0].fi >= st[rt].mxy[1].fi) 77 st[rt].mxy[1] = st[rt<<1|1].mxy[0]; 78 else if(st[rt<<1|1].mxy[1].se != -1 && st[rt<<1|1].mxy[1].se != st[rt].mxy[0].se && st[rt<<1|1].mxy[1].fi >= st[rt].mxy[1].fi) 79 st[rt].mxy[1] = st[rt<<1|1].mxy[1]; 80 } 81 //mny 82 if(st[rt].mny[0].se == -1) st[rt].mny[0] = st[rt<<1|1].mny[0], st[rt].mny[1] = st[rt<<1|1].mny[1]; 83 else if(st[rt<<1|1].mny[0] <= st[rt].mny[0]) { 84 if(st[rt<<1|1].mny[0].se != st[rt].mny[0].se) { 85 st[rt].mny[1] = st[rt].mny[0], st[rt].mny[0] = st[rt<<1|1].mny[0]; 86 if(st[rt<<1|1].mny[1].se != -1 && st[rt<<1|1].mny[1].se != st[rt].mny[0].se && st[rt<<1|1].mny[1].fi <= st[rt].mny[1].fi) 87 st[rt].mny[1] = st[rt<<1|1].mny[1]; 88 } else { 89 st[rt].mny[0] = st[rt<<1|1].mny[0]; 90 if(st[rt<<1|1].mny[1].se != -1 && st[rt<<1|1].mny[1].se != st[rt].mny[0].se && st[rt<<1|1].mny[1].fi <= st[rt].mny[1].fi) 91 st[rt].mny[1] = st[rt<<1|1].mny[1]; 92 } 93 } else { 94 if(st[rt<<1|1].mny[0].se != st[rt].mny[0].se && st[rt<<1|1].mny[0].fi <= st[rt].mny[1].fi) 95 st[rt].mny[1] = st[rt<<1|1].mny[0]; 96 else if(st[rt<<1|1].mny[1].se != -1 && st[rt<<1|1].mny[1].se != st[rt].mny[0].se && st[rt<<1|1].mny[1].fi <= st[rt].mny[1].fi) 97 st[rt].mny[1] = st[rt<<1|1].mny[1]; 98 } 99 } 100 101 void build(int rt,int l,int r) { 102 if(l == r) { 103 st[rt].mxx[0].fi = st[rt].mnx[0].fi = x[l], st[rt].mxx[0].se = st[rt].mnx[0].se = c[l]; 104 st[rt].mxx[1].se = st[rt].mnx[1].se = -1; 105 st[rt].mxy[0].fi = st[rt].mny[0].fi = y[l], st[rt].mxy[0].se = st[rt].mny[0].se = c[l]; 106 st[rt].mxy[1].se = st[rt].mny[1].se = -1; 107 return ; 108 } 109 int mid = (l + r) >> 1; 110 build(rt<<1,l,mid); 111 build(rt<<1|1,mid + 1,r); 112 pushup(rt); 113 } 114 115 void update(int rt,int l,int r,int pos) { 116 if(l == r) { 117 st[rt].mxx[0].fi = st[rt].mnx[0].fi = x[l], st[rt].mxx[0].se = st[rt].mnx[0].se = c[l]; 118 st[rt].mxx[1].se = st[rt].mnx[1].se = -1; 119 st[rt].mxy[0].fi = st[rt].mny[0].fi = y[l], st[rt].mxy[0].se = st[rt].mny[0].se = c[l]; 120 st[rt].mxy[1].se = st[rt].mny[1].se = -1; 121 return ; 122 } 123 int mid = (l + r) >> 1; 124 if(pos <= mid) update(rt<<1,l,mid,pos); 125 else update(rt<<1|1,mid + 1,r,pos); 126 pushup(rt); 127 } 128 129 node ans; 130 131 void query(int rt,int l,int r,int ql,int qr) { 132 if(ql <= l && qr >= r) { 133 //mxx 134 if(ans.mxx[0].se == -1) ans.mxx[0] = st[rt].mxx[0], ans.mxx[1] = st[rt].mxx[1]; 135 else if(st[rt].mxx[0] >= ans.mxx[0]) { 136 if(st[rt].mxx[0].se != ans.mxx[0].se) { 137 ans.mxx[1] = ans.mxx[0], ans.mxx[0] = st[rt].mxx[0]; 138 if(st[rt].mxx[1].se != -1 && st[rt].mxx[1].se != ans.mxx[0].se && st[rt].mxx[1].fi >= ans.mxx[1].fi) 139 ans.mxx[1] = st[rt].mxx[1]; 140 } else { 141 ans.mxx[0] = st[rt].mxx[0]; 142 if(st[rt].mxx[1].se != -1 && st[rt].mxx[1].se != ans.mxx[0].se && st[rt].mxx[1].fi >= ans.mxx[1].fi) 143 ans.mxx[1] = st[rt].mxx[1]; 144 } 145 } else { 146 if(st[rt].mxx[0].se != ans.mxx[0].se && st[rt].mxx[0].fi >= ans.mxx[1].fi) 147 ans.mxx[1] = st[rt].mxx[0]; 148 else if(st[rt].mxx[1].se != -1 && st[rt].mxx[1].se != ans.mxx[0].se && st[rt].mxx[1].fi >= ans.mxx[1].fi) 149 ans.mxx[1] = st[rt].mxx[1]; 150 } 151 //mnx 152 if(ans.mnx[0].se == -1) ans.mnx[0] = st[rt].mnx[0], ans.mnx[1] = st[rt].mnx[1]; 153 else if(st[rt].mnx[0] <= ans.mnx[0]) { 154 if(st[rt].mnx[0].se != ans.mnx[0].se) { 155 ans.mnx[1] = ans.mnx[0], ans.mnx[0] = st[rt].mnx[0]; 156 if(st[rt].mnx[1].se != -1 && st[rt].mnx[1].se != ans.mnx[0].se && st[rt].mnx[1].fi <= ans.mnx[1].fi) 157 ans.mnx[1] = st[rt].mnx[1]; 158 } else { 159 ans.mnx[0] = st[rt].mnx[0]; 160 if(st[rt].mnx[1].se != -1 && st[rt].mnx[1].se != ans.mnx[0].se && st[rt].mnx[1].fi <= ans.mnx[1].fi) 161 ans.mnx[1] = st[rt].mnx[1]; 162 } 163 } else { 164 if(st[rt].mnx[0].se != ans.mnx[0].se && st[rt].mnx[0].fi <= ans.mnx[1].fi) 165 ans.mnx[1] = st[rt].mnx[0]; 166 else if(st[rt].mnx[1].se != -1 && st[rt].mnx[1].se != ans.mnx[0].se && st[rt].mnx[1].fi <= ans.mnx[1].fi) 167 ans.mnx[1] = st[rt].mnx[1]; 168 } 169 //mxy 170 if(ans.mxy[0].se == -1) ans.mxy[0] = st[rt].mxy[0], ans.mxy[1] = st[rt].mxy[1]; 171 else if(st[rt].mxy[0] >= ans.mxy[0]) { 172 if(st[rt].mxy[0].se != ans.mxy[0].se) { 173 ans.mxy[1] = ans.mxy[0], ans.mxy[0] = st[rt].mxy[0]; 174 if(st[rt].mxy[1].se != -1 && st[rt].mxy[1].se != ans.mxy[0].se && st[rt].mxy[1].fi >= ans.mxy[1].fi) 175 ans.mxy[1] = st[rt].mxy[1]; 176 } else { 177 ans.mxy[0] = st[rt].mxy[0]; 178 if(st[rt].mxy[1].se != -1 && st[rt].mxy[1].se != ans.mxy[0].se && st[rt].mxy[1].fi >= ans.mxy[1].fi) 179 ans.mxy[1] = st[rt].mxy[1]; 180 } 181 } else { 182 if(st[rt].mxy[0].se != ans.mxy[0].se && st[rt].mxy[0].fi >= ans.mxy[1].fi) 183 ans.mxy[1] = st[rt].mxy[0]; 184 else if(st[rt].mxy[1].se != -1 && st[rt].mxy[1].se != ans.mxy[0].se && st[rt].mxy[1].fi >= ans.mxy[1].fi) 185 ans.mxy[1] = st[rt].mxy[1]; 186 } 187 //mny 188 if(ans.mny[0].se == -1) ans.mny[0] = st[rt].mny[0], ans.mny[1] = st[rt].mny[1]; 189 else if(st[rt].mny[0] <= ans.mny[0]) { 190 if(st[rt].mny[0].se != ans.mny[0].se) { 191 ans.mny[1] = ans.mny[0], ans.mny[0] = st[rt].mny[0]; 192 if(st[rt].mny[1].se != -1 && st[rt].mny[1].se != ans.mny[0].se && st[rt].mny[1].fi <= ans.mny[1].fi) 193 ans.mny[1] = st[rt].mny[1]; 194 } else { 195 ans.mny[0] = st[rt].mny[0]; 196 if(st[rt].mny[1].se != -1 && st[rt].mny[1].se != ans.mny[0].se && st[rt].mny[1].fi <= ans.mny[1].fi) 197 ans.mny[1] = st[rt].mny[1]; 198 } 199 } else { 200 if(st[rt].mny[0].se != ans.mny[0].se && st[rt].mny[0].fi <= ans.mny[1].fi) 201 ans.mny[1] = st[rt].mny[0]; 202 else if(st[rt].mny[1].se != -1 && st[rt].mny[1].se != ans.mny[0].se && st[rt].mny[1].fi <= ans.mny[1].fi) 203 ans.mny[1] = st[rt].mny[1]; 204 } 205 return ; 206 } 207 int mid = (l + r) >> 1; 208 if(qr <= mid) query(rt<<1,l,mid,ql,qr); 209 else if(ql > mid) query(rt<<1|1,mid + 1,r,ql,qr); 210 else { 211 query(rt<<1,l,mid,ql,mid); 212 query(rt<<1|1,mid + 1,r,mid + 1,qr); 213 } 214 } 215 216 int main() { 217 #ifdef local 218 freopen("data.txt", "r", stdin); 219 // freopen("data.txt", "w", stdout); 220 #endif 221 int cas = 1; 222 int t; 223 scanf("%d",&t); 224 while(t--) { 225 printf("Case #%d:\n",cas++); 226 int n,m; 227 scanf("%d%d",&n,&m); 228 for(int i = 1; i <= n; i++) { 229 ll x0,y0; 230 scanf("%lld%lld%d",&x0,&y0,&c[i]); 231 x[i] = x0 + y0, y[i] = x0 - y0; 232 } 233 build(1,1,n); 234 while(m--) { 235 int op; 236 scanf("%d",&op); 237 if(op == 1) { 238 int k; 239 ll x0,y0; 240 scanf("%d%lld%lld",&k,&x0,&y0); 241 x[k] += x0 + y0, y[k] += x0 - y0; 242 update(1,1,n,k); 243 } else if(op == 2) { 244 int k,col; 245 scanf("%d%d",&k,&col); 246 c[k] = col; 247 update(1,1,n,k); 248 } else if(op == 3) { 249 int l,r; 250 scanf("%d%d",&l,&r); 251 252 for(int i = 0; i < 2; i++) { 253 ans.mxx[i].se = ans.mnx[i].se = -1; 254 ans.mxy[i].se = ans.mny[i].se = -1; 255 } 256 query(1,1,n,l,r); 257 ll out = 0; 258 //x 259 if(ans.mxx[0].se != -1) { 260 if(ans.mxx[1].se != -1 && ans.mxx[1].se != ans.mxx[0].se) 261 out = max(out,abs(ans.mxx[0].fi - ans.mxx[1].fi)); 262 if(ans.mnx[0].se != -1 && ans.mnx[0].se != ans.mxx[0].se) 263 out = max(out,abs(ans.mxx[0].fi - ans.mnx[0].fi)); 264 if(ans.mnx[1].se != -1 && ans.mnx[1].se != ans.mxx[0].se) 265 out = max(out,abs(ans.mxx[0].fi - ans.mnx[1].fi)); 266 } 267 if(ans.mxx[1].se != -1) { 268 if(ans.mnx[0].se != -1 && ans.mnx[0].se != ans.mxx[1].se) 269 out = max(out,abs(ans.mxx[1].fi - ans.mnx[0].fi)); 270 if(ans.mnx[1].se != -1 && ans.mnx[1].se != ans.mxx[1].se) 271 out = max(out,abs(ans.mxx[1].fi - ans.mnx[1].fi)); 272 } 273 if(ans.mnx[0].se != -1 && ans.mnx[1].se != -1) 274 out = max(out,abs(ans.mnx[0].fi - ans.mnx[1].fi)); 275 //y 276 if(ans.mxy[0].se != -1) { 277 if(ans.mxy[1].se != -1 && ans.mxy[1].se != ans.mxy[0].se) 278 out = max(out,abs(ans.mxy[0].fi - ans.mxy[1].fi)); 279 if(ans.mny[0].se != -1 && ans.mny[0].se != ans.mxy[0].se) 280 out = max(out,abs(ans.mxy[0].fi - ans.mny[0].fi)); 281 if(ans.mny[1].se != -1 && ans.mny[1].se != ans.mxy[0].se) 282 out = max(out,abs(ans.mxy[0].fi - ans.mny[1].fi)); 283 } 284 if(ans.mxy[1].se != -1) { 285 if(ans.mny[0].se != -1 && ans.mny[0].se != ans.mxy[1].se) 286 out = max(out,abs(ans.mxy[1].fi - ans.mny[0].fi)); 287 if(ans.mny[1].se != -1 && ans.mny[1].se != ans.mxy[1].se) 288 out = max(out,abs(ans.mxy[1].fi - ans.mny[1].fi)); 289 } 290 if(ans.mny[0].se != -1 && ans.mny[1].se != -1) 291 out = max(out,abs(ans.mny[0].fi - ans.mny[1].fi)); 292 printf("%lld\n",out); 293 } 294 } 295 } 296 return 0; 297 }