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 }
View Code

相关文章: