hdu 4666 最远曼哈顿

一般这也太难想到了,这道题完全根据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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值