日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))...

發(fā)布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:

  https://codeforces.com/contest/1093/problem/G

題目:

題意:

  在k維空間中有n個點(diǎn),每次給你兩種操作,一種是將某一個點(diǎn)的坐標(biāo)改為另一個坐標(biāo),一種操作是查詢[l,r]中曼哈頓距離最大的兩個點(diǎn)的最大曼哈頓距離。

思路:

  對于曼哈頓距離,我們將其絕對值去掉會發(fā)現(xiàn)如下規(guī)律(以二維為例):

    

  故這題我們可以用線段樹來維護(hù)[l,r]中上述每種情況的最大值和最小值,用二進(jìn)制來枚舉xy的符號(1為正,0為負(fù)),最后答案是 每種情況中區(qū)間最大值-區(qū)間最小值 的最大值。

代碼實現(xiàn)如下:

1 #include <set> 2 #include <map> 3 #include <deque> 4 #include <queue> 5 #include <stack> 6 #include <cmath> 7 #include <ctime> 8 #include <bitset> 9 #include <cstdio> 10 #include <string> 11 #include <vector> 12 #include <cstdlib> 13 #include <cstring> 14 #include <iostream> 15 #include <algorithm> 16 using namespace std; 17 18 typedef long long LL; 19 typedef pair<LL, LL> pLL; 20 typedef pair<LL, int> pli; 21 typedef pair<int, LL> pil;; 22 typedef pair<int, int> pii; 23 typedef unsigned long long uLL; 24 25 #define lson rt<<1 26 #define rson rt<<1|1 27 #define lowbit(x) x&(-x) 28 #define name2str(name) (#name) 29 #define bug printf("*********\n") 30 #define debug(x) cout<<#x"=["<<x<<"]" <<endl 31 #define FIN freopen("D://code//in.txt", "r", stdin) 32 #define IO ios::sync_with_stdio(false),cin.tie(0) 33 34 const double eps = 1e-8; 35 const int mod = 1000000007; 36 const int maxn = 2e5 + 7; 37 const double pi = acos(-1); 38 const int inf = 0x3f3f3f3f; 39 const LL INF = 0x3f3f3f3f3f3f3f3fLL; 40 41 int n, k, q, op, x, l, r; 42 int a[maxn][10], num[10]; 43 44 struct node { 45 int l, r, mx, mn; 46 }segtree[maxn<<2][33]; 47 48 void push_up(int rt, int pp) { 49 segtree[rt][pp].mx = max(segtree[lson][pp].mx, segtree[rson][pp].mx); 50 segtree[rt][pp].mn = min(segtree[lson][pp].mn, segtree[rson][pp].mn); 51 } 52 53 void build(int rt, int l, int r, int pp) { 54 segtree[rt][pp].l = l, segtree[rt][pp].r = r; 55 segtree[rt][pp].mx = segtree[rt][pp].mn = 0; 56 if(l == r) { 57 for(int i = 0; i < k; i++) { 58 if(pp & (1<<i)) { 59 segtree[rt][pp].mx += a[l][i]; 60 segtree[rt][pp].mn += a[l][i]; 61 } else { 62 segtree[rt][pp].mx -= a[l][i]; 63 segtree[rt][pp].mn -= a[l][i]; 64 } 65 } 66 return; 67 } 68 int mid = (l + r) >> 1; 69 build(lson, l, mid, pp); 70 build(rson, mid + 1, r, pp); 71 push_up(rt, pp); 72 } 73 74 void update(int rt, int pos, int pp) { 75 if(segtree[rt][pp].l == segtree[rt][pp].r) { 76 segtree[rt][pp].mx = segtree[rt][pp].mn = 0; 77 for(int i = 0; i < k; i++) { 78 if(pp & (1<<i)) { 79 segtree[rt][pp].mx += num[i]; 80 segtree[rt][pp].mn += num[i]; 81 } else { 82 segtree[rt][pp].mx -= num[i]; 83 segtree[rt][pp].mn -= num[i]; 84 } 85 } 86 return; 87 } 88 int mid = (segtree[rt][pp].l + segtree[rt][pp].r) >> 1; 89 if(pos <= mid) update(lson, pos, pp); 90 else update(rson, pos, pp); 91 push_up(rt, pp); 92 } 93 94 int query(int rt, int l, int r, int pp, int op) { 95 if(segtree[rt][pp].l >= l && segtree[rt][pp].r <= r) { 96 if(op == 1) { 97 return segtree[rt][pp].mx; 98 } else { 99 return segtree[rt][pp].mn; 100 } 101 } 102 int mid = (segtree[rt][pp].l + segtree[rt][pp].r) >> 1; 103 if(r <= mid) return query(lson, l, r, pp, op); 104 else if(l > mid) return query(rson, l, r, pp, op); 105 else { 106 if(op == 1) return max(query(lson, l, mid, pp, op), query(rson, mid + 1, r, pp, op)); 107 else return min(query(lson, l, mid, pp, op), query(rson, mid + 1, r, pp, op)); 108 } 109 } 110 111 int main(){ 112 #ifndef ONLINE_JUDGE 113 FIN; 114 #endif 115 scanf("%d%d", &n, &k); 116 for(int i = 1; i <= n; i++) { 117 for(int j = 0; j < k; j++) { 118 scanf("%d", &a[i][j]); 119 } 120 } 121 for(int i = 0; i < (1<<k); i++) { 122 build(1, 1, n, i); 123 } 124 scanf("%d", &q); 125 while(q--) { 126 scanf("%d", &op); 127 if(op == 1) { 128 scanf("%d", &x); 129 for(int i = 0; i < k; i++) { 130 scanf("%d", &num[i]); 131 } 132 for(int i = 0; i <(1<<k); i++) { 133 update(1, x, i); 134 } 135 } else { 136 scanf("%d%d", &l, &r); 137 int mx = -inf; 138 for(int i = 0; i < (1<<k); i++) { 139 mx = max(mx, query(1, l, r, i, 1) - query(1, l, r, i, 2)); 140 } 141 printf("%d\n", mx); 142 } 143 } 144 return 0; 145 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Dillonh/p/10125587.html

總結(jié)

以上是生活随笔為你收集整理的Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。