一般这也太难想到了,这道题完全根据09年武森写的一篇《《浅谈信息学竞赛中的“0”和“1”——二进制思想在信息学竞赛中的应用》》一文中的一个例子写的。
以后得学着看论文喽~
考察multiset的使用
做完这道题可以再看一下poj2926
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<set>
#include<map>
#include<stdlib.h>
using namespace std;
multiset<int >mst[100];
int s[600005][10];
int main()
{
int q,k,od,p;
while(scanf("%d%d",&q,&k)!=EOF)
{
for(int i=0; i<=100; i++)
mst[i].clear();
for(int i=1; i<=q; i++)
{
scanf("%d",&od);
if(od==0)
{
for(int j=0; j<k; j++)
scanf("%d",&s[i][j]);
for(int i1=0; i1<(1<<k); i1++)
{
int t=0;
for(int j1=0; j1<k; j1++)
{
if(i1&(1<<j1))
t+=s[i][j1];
else
t-=s[i][j1];
}
mst[i1].insert(t);
}
}
else
{
scanf("%d",&p);
for(int i1=0; i1<(1<<k); i1++)
{
int t=0;
for(int j1=0; j1<k; j1++)
{
if(i1&(1<<j1))
t+=s[p][j1];
else
t-=s[p][j1];
}
multiset<int>::iterator it=mst[i1].find(t);
mst[i1].erase(it);
}
}
int ans=0;
for(int i=0; i<(1<<k); i++)
{
multiset<int>::iterator it=mst[i].end();
it--;
int Max=(*it);
it=mst[i].begin();
int Min=(*it);
ans=max(ans,Max-Min);
}
printf("%d\n",ans);
}
}
return 0;
}