HDU 4666 Hyperspace(优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4666
题意:两种操作:(1)增加一个点到序列中;(2)删除序列中的某个点。在每次操作之后,输出序列中曼哈顿距离最远的两个点之间的距离。点最大为5维。
思路:我们先看二维空间的点,设两个点为(x1,y1),(x2,y2),那么曼哈顿距离为|x1-x2|+|y1-y2|,现在我们去掉绝对值,那么有四种情况:
(x1-x2)+(y1-y2) (x2-x1)+(y1-y2) (x1-x2)+(y2-y1) (x2-x1)+(y2-y1)
由于这四个式子中绝对值均小于等于|x1-x2|+|y1-y2|,而最大的等于|x1-x2|+|y1-y2|,因此我们只要求这四个式子的绝对值的最大值即可。这四个式子进一步变形得到:(x1+y1)-(x2+y2),(-x1+y1)-(-x2+y2),(x1-y1)-(x2-y2),(-x1-y1)-(-x2-y2)。也就是我们我们可以保存四种情况的下每个点的最大值最小值,每种情况的最大最小值之差就是这种情况下的答案,四种情况下的最大值就是答案。
对于这道题,最大5维,也就是最多2^5种情况,用2^5*2(最大值最小值)个堆保存即可。
struct node
{
int p[N],q[N],a[N],size;
void init()
{
size=0;
}
void pushUp(int t)
{
while(1)
{
if(t/2>=1&&a[t/2]<a[t])
{
swap(a[t],a[t/2]);
swap(q[t],q[t/2]);
p[q[t]]=t;
p[q[t/2]]=t/2;
t=t/2;
}
else break;
}
}
void pushDown(int t)
{
int x;
while(1)
{
if(t*2<=size&&a[t*2]>a[t]) x=t*2;
else x=t;
if(t*2+1<=size&&a[t*2+1]>a[x]) x=t*2+1;
if(x==t) break;
swap(a[t],a[x]);
swap(q[t],q[x]);
p[q[t]]=t;
p[q[x]]=x;
t=x;
}
}
void insert(int k,int id)
{
a[++size]=k;
q[size]=id;
p[id]=size;
pushUp(size);
}
void del(int id)
{
if(size==1)
{
size=0;
return;
}
int x=p[id];
a[x]=a[size];
q[x]=q[size--];
p[q[x]]=x;
pushUp(x);
pushDown(x);
}
int top()
{
if(size==0) return 0;
return a[1];
}
};
node a[32][2];
int n,m;
void insert(int p[],int id)
{
int sum,i,j;
FOR0(i,(1<<m))
{
sum=0;
FOR0(j,m)
{
if(i&(1<<j)) sum+=p[j];
else sum-=p[j];
}
a[i][0].insert(sum,id);
a[i][1].insert(-sum,id);
}
}
void del(int id)
{
int i;
FOR0(i,(1<<m))
{
a[i][0].del(id);
a[i][1].del(id);
}
}
int query()
{
int ans=0,i;
FOR0(i,(1<<m)) upMax(ans,a[i][0].top()+a[i][1].top());
return ans;
}
int main()
{
Rush(n)
{
RD(m);
int i,j;
FOR0(i,(1<<m)) a[i][0].init(),a[i][1].init();
int op,p[5];
FOR1(i,n)
{
RD(op);
if(op==0)
{
FOR0(j,m) RD(p[j]);
insert(p,i);
}
else
{
RD(p[0]); del(p[0]);
}
PR(query());
}
}
}
HDU 4666 Hyperspace(优先队列)相关推荐
- hdu 4666 Hyperspace
点击打开hdu 4666 思路:n维空间计算最远的曼哈顿距离 分析: 1 这一题和poj2926很像,但是poj那题是静态的而这边则是动态的,对于静态的话我们知道只要去求出2^n状态下的最大值和最小值 ...
- HDU 4666 Hyperspace【最远曼哈顿距离+优先队列】
这个题是动态的求最远曼哈顿距离.做法和POJ 2926 Requirements一样,都是通过二进制枚举符号的情况. 每插入一个节点都要询问最大值和最小值,因此用一个优先队列或者堆维护就可以了. #i ...
- [HDU 4666]Hyperspace[最远曼哈顿距离][STL]
题意: 许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果. 思路: 用"疑似绝对值"的思想, 维护每种状态 ...
- HDU 4666 Hyperspace(最长曼哈顿距离)
POJ 2926加强版,使用set处理,, //#pragma comment(linker, "/STACK:102400000,102400000") #include< ...
- Hyperspace HDU - 4666
http://acm.hdu.edu.cn/showproblem.php?pid=4666 动态求最远曼哈顿距离 线段树维护区间最值就好 但是k维空间会有2^k种情况 只能离线每一种情况 最后么一个 ...
- HDU 5437by cyl优先队列
HDU 5437 题意: 有个人要过生日,有k个朋友来拜访,但是他家里实在是有点小,只能依次让朋友进门,有m个特定的时间,每次可以进入p个人,每一个朋友来会带礼物,价值为v.主人还是比较贪心的,他 ...
- HDU 幸福列车 优先队列
幸福列车 一批幸福的列车即将从杭州驶向幸福的终点站――温州,身为总列车长的linle有一些奇怪的癖好. 他会记录下全部乘客的名字(name)和他们的人品值(RP),根据这些将他们排序,并不时地从某辆列 ...
- 4666 Hyperspace stl
当时自己做的时候没有这么想,想的是每个象限去找一个无穷值来作为比较点.但是很麻烦 代码: 1 #include <stdio.h> 2 #include <string.h> ...
- 【水题】 HDOJ 4666 Hyperspace
2009年国家集训队武森论文 最远哈密顿距离...论文题. #include <iostream> #include <queue> #include <stack> ...
最新文章
- 酸奶饮料新产品口味测试研究案例
- IAR建立stm32工程
- 多线程介绍和多线程模块-lock-互斥锁
- 回溯的问题合集(Leetcode题解-Python语言)
- 力扣长度最小的子数组
- JVM JRE JDK,这些东西到底是什么?(转载)
- 惠普光影精灵拆机换屏幕_聊聊惠普游戏本大军的“先遣部队”
- 极客大学产品经理训练营:产品规划与功能规划 第15课总结
- 几款免费PDF合并成一个PDF的软件推荐,快收藏起来吧
- 构建一个可行的BI系统的造价是多少,实施周期?具备条件基础是什么? 数据量有要求么
- 滤波器截止频率理解?
- 蓝桥杯 等差素数列(python实现)
- spss分析qpcr数据_qRT-PCR差异分析及P值计算
- 思科序列号无服务器,查看思科设备序列号以及序列号的命名格式
- Python动态可视化Cufflinks
- Web超简单入门(附带项目的讲解)
- android使用精伦身份证读卡器读身份证
- Windows10如何开启Mysql
- 创蓝闪验一键登录(Java实现)
- 2021-06-28页面自动跳转