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;}