hdu4666Hyperspace

时间:2021-08-18 06:18:52

http://acm.hdu.edu.cn/showproblem.php?pid=4666

先看一个求曼哈顿的帖子http://www.cnblogs.com/lmnx/articles/2479747.html

然后用mulityset进行维护下就可以了

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<set>
using namespace std;
#define N 60010
int w[N][];
int main()
{
int i,j,q,g,k;
while(cin>>q>>k)
{
multiset<int>p[];
multiset<int>::iterator it;
for(g = ; g <= q ; g++)
{
int a;
scanf("%d",&a);
if(a==)
{
for(i =; i < k ; i++)
scanf("%d",&w[g][i]);
for(i = ; i < <<k ; i++)
{
int temp = ;
for(j = ; j < k ; j++)
{
if(i&(<<j))
temp+=w[g][j];
else
temp-=w[g][j];
}
p[i].insert(temp);
}
}
else
{
int x;
scanf("%d",&x);
for(i = ; i < <<k ; i++)
{
int temp=;
for(j = ; j < k ; j++)
{
if(i&(<<j))
temp+=w[x][j];
else
temp-=w[x][j];
}
it = p[i].find(temp);
p[i].erase(it);
}
}
int maxz=;
for(i = ; i < <<k ; i++)
{
j =(~i)&((<<k)-);
int t1,t2;
it = p[i].end();
it--;
t1 = (*it);
it = p[j].end();
it--;
t2 = (*it);
maxz = max(maxz,t1+t2);
}
cout<<maxz<<endl;
}
}
return ;
}

相关文章