您的位置:首页 > 其它

hdu 4666 最远曼哈顿

2013-08-29 15:39 344 查看
一般这也太难想到了,这道题完全根据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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: