当时自己做的时候没有这么想,想的是每个象限去找一个无穷值来作为比较点。但是很麻烦
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <set> 8 #include <queue> 9 #include <stack> 10 #define loop(s,i,n) for(i = s;i < n;i++) 11 #define cl(a,b) memset(a,b,sizeof(a)) 12 using namespace std; 13 int a[60050][10]; 14 int main() 15 { 16 int n,k; 17 while(~scanf("%d %d",&n,&k)) 18 { 19 int i,o,j; 20 multiset<int>mst[50]; 21 for(i = 1;i <= n;i++) 22 { 23 scanf("%d",&o); 24 int maxans = 0; 25 if(o == 0) 26 { 27 for(j = 0;j < k;j++) 28 { 29 scanf("%d",&a[i][j]); 30 } 31 32 for(j = 0;j < (1<<(k));j++) 33 { 34 int ii,sum; 35 for(ii = 0,sum = 0;ii < k;ii++) 36 { 37 if(j & (1<<ii)) 38 sum += a[i][ii]; 39 else 40 sum -= a[i][ii]; 41 } 42 mst[j].insert(sum); 43 } 44 } 45 else 46 { 47 int del; 48 scanf("%d",&del); 49 for(j = 0;j < (1<<(k));j++) 50 { 51 int sum = 0; 52 for(int ii = 0;ii < k;ii++) 53 { 54 if(j & (1<<ii)) 55 sum += a[del][ii]; 56 else 57 sum -= a[del][ii]; 58 } 59 multiset<int>::iterator it; 60 it = mst[j].find(sum); 61 62 mst[j].erase(it); 63 } 64 } 65 maxans = 0; 66 for(j = 0;j < (1 << (k));j++) 67 { 68 multiset<int>::iterator it1; 69 multiset<int>::iterator it2; 70 if(mst[j].size() > 0) 71 { 72 it1 = mst[j].begin(); 73 it2 = mst[j].end(); 74 it2--; 75 maxans = max(maxans,*it2-*it1); 76 } 77 } 78 cout<<maxans<<endl; 79 80 } 81 } 82 return 0; 83 }