可以添加和删除点,问这些点中两点间的最大曼哈顿距离
曼哈顿距离:(x0,y0,z0) (x1,y1,z1) d=|x0-x1|+|y0-y1|+|z0-z1|
去掉绝对值符号,整理后发现 d=(+-x0+-y0+-z0)-(+-x1+-y1+-z1) ***前后括号中对应的符号相同***
因此只需记录相应符号下的最大,最小值即可
应用set ,set中的元素默认是按从小到大的顺序的,因此感觉可以取代优先队列
multiset中的元素可重复,set中不可以
.find() 返回迭代器 .erase()是删除,参数也为迭代器
#include<iostream>
#include<set>
using namespace std;
multiset<int> mset[1<<5];
int num[60010][6];
int main()
{
std::ios::sync_with_stdio(false);
int q,k;
while(cin>>q>>k)
{
for(int i=0;i<(1<<5);i++)
{
mset[i].clear();
}
int a;
for(int i=1;i<=q;i++)
{
cin>>a;
if(!a)
{
for(int x=0;x<k;x++) cin>>num[i][x];
for(int x=0;x<(1<<k);x++)
{
int sum=0;
for(int j=0;j<k;j++)
{
if(x&(1<<j)) sum+=num[i][j];
else sum-=num[i][j];
}
mset[x].insert(sum);
//cout<<sum;
}
}
else
{
int b;
cin>>b;
for(int j=0;j<(1<<k);j++)
{
int sum=0;
for(int x=0;x<k;x++)
{
if(j&(1<<x)) sum+=num[b][x];
else sum-=num[b][x];
}
multiset<int>::iterator it0;
it0=mset[j].find(sum);
mset[j].erase(it0);
}
}
int maxx=0;
for(int j=0;j<(1<<k);j++)
{
multiset<int>::iterator it1,it2;
it1=mset[j].begin();
it2=mset[j].end();
it2--;
//cout<<*it1<<" "<<*it2<<endl;
//cout<<*it1-*it2<<" ";
//for(it1;it1!=it2;it1++) cout<<*it1<<" ";
//cout<<endl;
maxx=max(maxx,(*it2)-(*it1));
}
cout<<maxx<<endl;
}
}
}