HDU 4666 Hyperspace
曼哈顿距离:|x1-x2|+|y1-y2|。
最远曼哈顿距离,枚举x1与x2的关系以及y1与y2的关系,取最大值就是答案。
1 #include<cstdio> 2 #include<set> 3 #define oo 0x7FFFFFFF 4 #define MAXM 35 5 #define MAXN 100010 6 using namespace std; 7 multiset<int> myset[MAXM]; 8 struct Ask { 9 int cmd; 10 int arr[MAXM]; 11 } q[MAXN]; 12 int main() { 13 int n, m; 14 int i, j, k; 15 int tmp; 16 int res; 17 int ans; 18 multiset<int>::iterator it1, it2; 19 while (~scanf("%d%d", &n, &m)) { 20 for (i = 0; i < MAXM; i++) { 21 myset[i].clear(); 22 } 23 for (i = 1; i <= n; i++) { 24 scanf("%d", &q[i].cmd); 25 if (q[i].cmd == 0) { 26 for (j = 0; j < m; j++) { 27 scanf("%d", &q[i].arr[j]); 28 } 29 } else { 30 scanf("%d", &tmp); 31 q[i].cmd = q[tmp].cmd ^ 1; 32 for (j = 0; j < m; j++) { 33 q[i].arr[j] = q[tmp].arr[j]; 34 } 35 } 36 } 37 for (i = 1; i <= n; i++) { 38 if (q[i].cmd == 0) { 39 for (j = 0; j < (1 << m); j++) { 40 tmp = j; 41 res = 0; 42 for (k = 0; k < m; tmp >>= 1, k++) { 43 if (tmp & 1) { 44 res -= q[i].arr[k]; 45 } else { 46 res += q[i].arr[k]; 47 } 48 } 49 myset[j].insert(res); 50 } 51 } else { 52 for (j = 0; j < (1 << m); j++) { 53 tmp = j; 54 res = 0; 55 for (k = 0; k < m; tmp >>= 1, k++) { 56 if (tmp & 1) { 57 res -= q[i].arr[k]; 58 } else { 59 res += q[i].arr[k]; 60 } 61 } 62 myset[j].erase(myset[j].find(res)); 63 } 64 } 65 ans = -oo; 66 for (j = 0; j < (1 << m); j++) { 67 if (myset[j].size() > 1) { 68 break; 69 } 70 } 71 if (j >= (1 << m)) { 72 ans = 0; 73 } else { 74 for (j = 0; j < (1 << m); j++) { 75 if (myset[j].size() > 1) { 76 it1 = myset[j].end(); 77 it1--; 78 it2 = myset[j].begin(); 79 ans = max(ans, (*it1 - *it2)); 80 } 81 } 82 } 83 printf("%d\n", ans); 84 } 85 } 86 return 0; 87 }