题意:
许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果.
思路:
用"疑似绝对值"的思想, 维护每种状态下各点的计算值, 插入或删除一个点就更新一次每种状态(用 multiset 或 map 或 priority_queue 实现), 每次求ans时扫一遍最大差值即可.
为了练习STL, 每一个都实现一次.
multiset
/* **********************************************
Author : kuangbin
Created Time: 2013/8/13 18:25:38
File Name : F:\2013ACM练习\2013多校7\1001.cpp
*********************************************** */
//4640MS 14972K
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
int a[60010][10];
multiset<int>mst[1<<5];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int q,k;
while(scanf("%d%d",&q,&k)==2)
{
for(int i = 0;i < (1<<k);i++)
mst[i].clear();
int od,x;
for(int i = 1;i <= q;i++)
{
scanf("%d",&od);
if(od == 0)
{
for(int j = 0;j < k;j++)
scanf("%d",&a[i][j]);
for(int j = 0; j < (1<<k); j++)
{//计算当前点在每种情况下的"疑似绝对值"
int s = 0;
for(int t = 0; t < k;t++)
if(j & (1<<t))
s += a[i][t];
else s -= a[i