4666 Hyperspace stl

当时自己做的时候没有这么想,想的是每个象限去找一个无穷值来作为比较点。但是很麻烦

代码:

 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 }
View Code
原文地址:https://www.cnblogs.com/0803yijia/p/3257301.html