10 2 0 208 403 0 371 -180 1 2 0 1069 -192 0 418 -525 1 5 1 1 0 2754 635 0 -2491 961 0 2954 -2516
0 746 0 1456 1456 1456 0 2512 5571 8922
题意:在m维空间,有n个操作,0 代表加入一个点,1 代表删去一个点。对每一个操作输出两点间最远的曼哈顿距离。
思路:用一个multiset插入和删除就可以了。C++ vector 插入删除太慢。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <string>
#define INF (2000000000+10)
#define eps 1e-8
#define MAXN (60000+10)
#define MAXM (600000+10)
#define Ri(a) scanf("%d", &a)
#define Rl(a) scanf("%lld", &a)
#define Rf(a) scanf("%lf", &a)
#define Rs(a) scanf("%s", a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%.2lf\n", (a))
#define Pl(a) printf("%lld\n", (a))
#define Ps(a) printf("%s\n", (a))
#define W(a) while((a)--)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define MOD 1000000007
#define LL long long
#define lson o<<1, l, mid
#define rson o<<1|1, mid+1, r
#define ll o<<1
#define rr o<<1|1
#define PI acos(-1.0)
#pragma comment(linker, "/STACK:102400000,102400000")
#define fi first
#define se second
using namespace std;
typedef pair<int, int> pii;
int a[MAXN][5];
multiset<int> G[1<<5];
multiset<int> ::iterator it;
int main()
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = 0; i < (1<<m); i++) G[i].clear();
for(int i = 1; i <= n; i++)
{
int op; Ri(op);
if(op == 0)
{
for(int j = 0; j < m; j++) Ri(a[i][j]);
for(int s = 0; s < (1<<m); s++)
{
int temp = 0;
for(int j = 0; j < m; j++)
{
if(s & (1<<j)) temp += a[i][j];
else temp -= a[i][j];
}
G[s].insert(temp);
}
}
else
{
int x; Ri(x);
for(int s = 0; s < (1<<m); s++)
{
int temp = 0;
for(int j = 0; j < m; j++)
{
if(s & (1<<j)) temp += a[x][j];
else temp -= a[x][j];
}
it = G[s].find(temp);
G[s].erase(it);
}
}
int ans = 0;
for(int s = 0; s < (1<<m); s++)
{
it = G[s].end(); it--;
int Max = *it;
it = G[s].begin();
int Min = *it;
ans = max(ans, Max - Min);
}
Pi(ans);
}
}
return 0;
}