曼哈顿距离,两个点设为(x1,y1),(x2,y2),其距离为|x1-x2|+|y1-y2|
#include <cstdio> #include <set> #include <cstring> #include <cstdlib> using namespace std; struct node { int pos; int sum; bool operator < (const node &p) const { return p.sum>sum; } node (int x,int y) { pos=x; sum=y; } }; set<node> s[34]; int n,m,cnt; int f_a[34][5],v[5]; bool d[60010]; void dfs(int cur) { if(cur==m) { for(int i=0; i<m; ++i) f_a[cnt][i]=v[i]; s[cnt++].clear(); return; } v[cur]=1; dfs(cur+1); v[cur]=-1; dfs(cur+1); } void solve(int cur) { for(int i=0; i<cnt; ++i) { int a=0; for(int j=0; j<m; ++j) a+=v[j]*f_a[i][j]; s[i].insert(node(cur,a)); } } void del() { int sum=0; for(int i=0; i<cnt; ++i) { set<node>::iterator p,q; while(s[i].size()) { p=s[i].begin(); if(d[p->pos]) s[i].erase(*p); else break; } while(s[i].size()) { q=s[i].end(); --q; if(d[q->pos]) s[i].erase(*q); else break; } if(!s[i].size()) continue; sum=max(sum,q->sum - p->sum); } printf("%d ",sum); } int main() { //freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF) { int f,pos; cnt=0; memset(d,0,sizeof(bool)*(n+1)); dfs(0); for(int i=1; i<=n; ++i) { scanf("%d",&f); if(!f) for(int j=0; j<m; ++j) scanf("%d",&v[j]); else { scanf("%d",&pos); d[pos]=1; } if(!f) solve(i); del(); } } return 0; }