hdu4666(曼哈顿距离+set或multiset)

来源:互联网 发布:2009伍声的淘宝店 编辑:程序博客网 时间:2024/05/02 22:48

#include<cstdio>#include<iostream>#include<cstdlib>#include<algorithm>#include<cmath>#include<string>#include<cstring>#include<set>#include<map>#include<list>#include<queue>#include<vector>#define tree int o,int l,int r#define lson o<<1,l,mid#define rson o<<1|1,mid+1,r#define lo o<<1#define ro o<<1|1#define ULL unsigned long long#define LL long long#define UI unsigned int#define inf 0x7fffffff#define eps 1e-7#define N 60009using namespace std;int T,n,m;int xi[35][6];int t[6],num;int isd[N];void dfs(int k){    if(k==m)    {        memcpy(xi[num++],t,sizeof(t));    }    else    {        t[k]=-1;        dfs(k+1);        t[k]=1;        dfs(k+1);    }}int main(){#ifndef ONLINE_JUDGE    freopen("ex.in","r",stdin);#endif    ;    while(scanf("%d%d",&n,&m)==2)    {        num=0;        memset(isd,0,sizeof(isd));        set<pair<int,int> >st[35];        set<pair<int,int> >::iterator it;        set<pair<int,int> >::iterator jt;        dfs(0);        for(int dd=0; dd<n; dd++)        {            int tt;            scanf("%d",&tt);            if(tt==0)            {                for(int i=0; i<m; i++)                    scanf("%d",&t[i]);                for(int i=0; i<num; i++)                {                    int tp=0;                    for(int j=0; j<m; j++)                    {                        tp+=xi[i][j]*t[j];                    }                    st[i].insert(make_pair(tp,dd+1));                }            }            else            {                int sub;                scanf("%d",&sub);                isd[sub]=1;            }            LL maxv=0;            for(int i=0; i<num; i++)            {                if(st[i].empty())continue;                while(!st[i].empty())                {                    it=st[i].begin();                    if(isd[it->second])st[i].erase(it);                    else break;                }                if(st[i].empty())continue;                while(!st[i].empty())                {                    jt=st[i].end();                    jt--;                    if(isd[jt->second])st[i].erase(jt);                    else break;                }                if(st[i].size()<2)continue;                maxv=max(maxv,(LL)jt->first-it->first);            }            printf("%I64d\n",maxv);        }    }    return 0;}


原创粉丝点击