Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 67 Accepted Submission(s): 32
经典的求最远曼哈顿距离。
可以看相应的论文:2009年国家集训队武森论文
其实就是维护(1<<k)个堆的最大值和最小值。
可以参考POJ 2926
我用multiset实现的。
可以使用map或者优先队列
1 /* ********************************************** 2 Author : kuangbin 3 Created Time: 2013/8/13 18:25:38 4 File Name : F:\2013ACM练习\2013多校7\1001.cpp 5 *********************************************** */ 6 7 #include <stdio.h> 8 #include <string.h> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <math.h> 17 #include <stdlib.h> 18 using namespace std; 19 int a[60010][10]; 20 multiset<int>mst[1<<5]; 21 22 int main() 23 { 24 //freopen("in.txt","r",stdin); 25 //freopen("out.txt","w",stdout); 26 int q,k; 27 while(scanf("%d%d",&q,&k)==2) 28 { 29 for(int i = 0;i < (1<<k);i++) 30 mst[i].clear(); 31 int od,x; 32 for(int i = 1;i <= q;i++) 33 { 34 scanf("%d",&od); 35 if(od == 0) 36 { 37 for(int j = 0;j < k;j++) 38 scanf("%d",&a[i][j]); 39 for(int j = 0; j < (1<<k); j++) 40 { 41 int s = 0; 42 for(int t = 0; t < k;t++) 43 if(j & (1<<t)) 44 s += a[i][t]; 45 else s -= a[i][t]; 46 mst[j].insert(s); 47 } 48 } 49 else 50 { 51 scanf("%d",&x); 52 for(int j = 0; j < (1<<k); j++) 53 { 54 int s = 0; 55 for(int t = 0; t < k;t++) 56 if(j & (1<<t)) 57 s += a[x][t]; 58 else s -= a[x][t]; 59 multiset<int>::iterator it = mst[j].find(s); 60 mst[j].erase(it); 61 } 62 } 63 int ans = 0; 64 for(int j = 0; j < (1<<k);j++) 65 { 66 multiset<int>::iterator it = mst[j].end(); 67 it--; 68 int t1 = (*it); 69 it = mst[j].begin(); 70 int t2 = (*it); 71 ans = max(ans,t1-t2); 72 } 73 printf("%d\n",ans); 74 } 75 } 76 return 0; 77 }