模板题,水过 c++输入输出超时,使用scanf
http://acm.hdu.edu.cn/showproblem.php?pid=4666
const int MAXN = 1000010;
struct Node
{
int a[6], b[35];
} s[MAXN];
///结构体保存每个点的维数距离(a),处理出来的状态(b)
multiset<int> mst[35];
///mst动态维护,对每一组状态保存一个域,里面存所有点
struct Manhattan
{
int k;
void init()
{
REP(i, 1 << k)
{
mst[i].clear();
}
}
///work每次处理处所有的状态,add为增加一个点,del为删除一个点
void work(int id)
{
REP(i, 1 << k)
{
int sum = 0;
for(int j = 0; j < k; j++)
{
if(i & (1 << j))
sum += s[id].a[j];
else
sum -= s[id].a[j];
}
s[id].b[i] = sum;
}
}
void add(int id)
{
work(id);
REP(i, 1 << k)
{
mst[i].insert(s[id].b[i]);
}
}
void del(int id)
{
for(int i = 0; i < (1 << k); i++)
{
mst[i].erase(mst[i].find(s[id].b[i]));
}
}
int get()
{
int ret = -1;
for(int i = 0; i < (1 << k); i++)
{
int a = *(mst[i].rbegin());
int b = *(mst[i].begin());
if(a - b > ret) ret = a - b;
}
return ret;
}
} mandis;
int main()
{
int n, type, id;
while (~RII(n, mandis.k))
{
mandis.init();
FE(kase, 1, n)
{
RI(type);
if (type == 0)
{
REP(i, mandis.k)
RI(s[kase].a[i]);
mandis.add(kase);
}
else
{
RI(id);
mandis.del(id);
}
WI(mandis.get());
}
}
return 0;
}