二进制转化,求最大曼哈顿距离....
10 2 0 208 403 0 371 -180 1 2 0 1069 -192 0 418 -525 1 5 1 1 0 2754 635 0 -2491 961 0 2954 -2516
0 746 0 1456 1456 1456 0 2512 5571 8922
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
const int maxn=66000;
int n,k,id;
int mat[maxn][5];
int pos[maxn];
multiset<int> SET[50];
void init()
{
id=0;
int nn=1<<k;
for(int i=0;i<nn;i++)
SET[i].clear();
}
int getSum(int id,int x)
{
int sum=0;
for(int i=0;i<k;i++)
{
if(x&(1<<i)) sum+=mat[id][i];
else sum-=mat[id][i];
}
return sum;
}
void add(int x)
{
int nn=1<<k;
for(int i=0;i<nn;i++)
{
int xx=getSum(x,i);
SET[i].insert(xx);
}
}
void rm(int x)
{
int nn=1<<k;
for(int i=0;i<nn;i++)
{
int xx=getSum(x,i);
SET[i].erase(SET[i].find(xx));
}
}
int check()
{
int nn=1<<k;
int ans=0;
for(int i=0;i<nn;i++)
{
multiset<int>::iterator S,E;
S=SET[i].begin();
E=SET[i].end();
E--;
ans=max(ans,*E-*S);
}
return ans;
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
init();
int kind;
for(int i=0;i<n;i++)
{
scanf("%d",&kind);
if(kind==0)
{
for(int j=0;j<k;j++)
{
scanf("%d",&mat[id][j]);
}
add(id);
pos[i+1]=id;
id++;
}
else
{
int rmid;
scanf("%d",&rmid);
rm(pos[rmid]);
}
printf("%d\n",check());
}
}
return 0;
}
原文:http://blog.csdn.net/ck_boss/article/details/41393789