吐个糟,尼玛今天被虐成狗了,一题都没搞出来,这题搞了N久居然还是搞不出来,一直TLE,最后还是参考别人代码才领悟的,思路就这么简单,

就是不会转弯,看着模板却不会改,艹,真怀疑自己是不是个笨蛋
题意:求n维空间的最远哈曼顿距离。给出n和k,下面n个操作,0表示添加一个k维空间的点,然后给出该点坐标,1 x表示删除第x个操作给出的点

,对于每个操作都输出最远哈曼顿距离,n《=60000,k《=5。
分析:最远曼哈顿距离的模板是直接求D维空间n个点的,复杂度是O(n*2^D),而该题要求每次加一个点就求一次最远曼哈顿距离,如果直接套模板

的话复杂度是O(n^2*2^D),这已经相当高了,再加上有删点操作,所以肯定是TLE的,我刚开始就是这么做的,应该要进行优化。
其实我们可以用堆或优先队列来优化,根据最远曼哈顿距离的求法(不懂得可以百度),其实就是找出每个点去绝对值后的形式,然后枚举所有的

组合再求出最大值,所以我们可以建立一个最小堆和最大堆,每加入一个点就枚举该点去绝对值后的形式(总共有2^D-1种),将其加入到对应的

两个堆中,将最大堆和最小堆堆顶元素相减,其实就是两点之间的曼哈顿距离了,最后枚举所有的形式,找最大值就行了。
对于删点操作,用一个数组p[]标记一下,在枚举形式求最大值时,判断一下堆顶元素是否是已被删的点,如果是的话,出堆就行了
还有就是求距离的时候不要像模板那样用二维数组,不然会爆内存的,我就是这样MLE了两次 =_=||
代码如下:

 #include<stdio.h>
#include<vector>
#include<string.h>
#include<queue>
using namespace std;
int coe[],minx[][],maxx[][],pt[];
int p[];
int minp,maxp,ans,m;
struct node1{
int s,i;
bool operator <(const node1 &a)const{
return s<a.s;
}
};
struct node2{
int s,i;
bool operator<(const node2 &a)const{
return s>a.s;
}
};
priority_queue<node1> q1[];
priority_queue<node2> q2[];
node1 x;
node2 y;
void GetD(int D){
int s,i,dis,tot=(<<D);
for(s=;s<tot;s++)
{
for(i=;i<D;i++)
if(s&(<<i))
coe[i]=-;
else
coe[i]=;
dis=;
for(i=;i<D;i++)
dis=dis+coe[i]*pt[i];
x.s=dis;
x.i=m;
y.s=dis;
y.i=m;
q1[s].push(x);
q2[s].push(y);
}
}
void Solve(int D)
{
int s,tot=(<<D);
int tmp;
for(s=;s<tot;s++)
{
while(!p[q1[s].top().i]&&!q1[s].empty())
q1[s].pop();
while(!p[q2[s].top().i]&&!q2[s].empty())
q2[s].pop();
maxx[s][]=q1[s].top().s;
maxx[s][]=q1[s].top().i;
minx[s][]=q2[s].top().s;
minx[s][]=q2[s].top().i;
}
ans=;
for(s=;s<tot;s++)
{
tmp=maxx[s][]-minx[s][];
if(tmp>ans)
{
ans=tmp;
maxp=maxx[s][];
minp=minx[s][];
}
}
printf("%d\n",ans);
}
int main()
{
int s,tot,n,k,i,od,x,j;
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(p,,sizeof(p));
minp=maxp=-;
tot=(<<k);
for(s=;s<tot;s++)
{
while(!q1[s].empty())
q1[s].pop();
while(!q2[s].empty())
q2[s].pop();
}
m=-;
for(i=;i<n;i++)
{
scanf("%d",&od);
m++;
if(od==)
{
p[i]=;
for(j=;j<k;j++)
scanf("%d",&pt[j]);
GetD(k);
Solve(k);
}
else
{
scanf("%d",&x);
p[x-]=;
if((x-)==minp||(x-)==maxp)
Solve(k);
else
printf("%d\n",ans);
}
}
}
return ;
}

多校联赛7 1001 hdu 4666(最远哈曼顿距离+优先队列)的更多相关文章

  1. HDU 4666 最远曼哈顿距离

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4666 关于最远曼哈顿距离的介绍: http://blog.csdn.net/taozifish/ar ...

  2. 2015 HDU 多校联赛 5363 Key Set

    2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...

  3. 2015 HDU 多校联赛 5317 RGCDQ 筛法求解

    2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...

  4. hdu 4666:Hyperspace(最远曼哈顿距离 + STL使用)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  5. 2019HDU多校第一场1001 BLANK (DP)(HDU6578)

    2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...

  6. HDU 4666 Hyperspace (2013多校7 1001题 最远曼哈顿距离)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  7. 2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)

    题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后 ...

  8. HDU 4627 The Unsolvable Problem 杭电多校联赛第三场1009 数学题

    题意描述:给出一个n,要求在所有满足n = a+b的a和b里面求a和b的最小公倍数最大的两个数的最小公倍数. 解题报告:比赛的时候看到这个题的第一反应就是寻找这两个数一定是在a和b比较接近的地方找,这 ...

  9. HDU 4639 hehe 杭电2013多校联赛第四场1008题

    解题报告:题目的意思是输入一个字符串,并规定,里面的“hehe”可以用"wqnmlgb"来代替,也可以不代替,问输入的这个字符串在经过相关的代替之后可以有多少种不同的形态.先打一个 ...

随机推荐

  1. DELL R710使用4T硬盘亮黄灯

    事件背景 公司DELL R710的物理机上面运行的SQL SERVER数据库,因存储空间不足需要扩充空间.现系统盘(300G SAS 6Gbps 15K*2)RAID 1,数据盘(500G SAS 6 ...

  2. C++ STL 学习笔记__(6)优先级队列priority_queue基本操作

    10.2.7优先级队列priority_queue v  最大值优先级队列.最小值优先级队列 v  优先级队列适配器 STL priority_queue v  用来开发一些特殊的应用,请对stl的类 ...

  3. LUOGU3278 [SCOI2013]多项式的运算

    一次AC.吼啊. BZOJ权限QAQ 区间加和乘打标记,区间乘x就是区间移动,平衡树解决即可. 查询直接遍历一遍然后算出来 // It is made by XZZ #include<cstdi ...

  4. Object C学习笔记1-基本数据类型说明

    Objective-C数据类型可以分为:基本数据类型.对象类型和id类型.基本数据类型有:int.float.double和char类型.对象类型就是类或协议所声明的指针类型,例如:NSAutorel ...

  5. C#简单的四位纯数字验证码

    验证码练手,整型.四位验证码 大体意思就是:四位纯数字验证,只要验证不成功就无限验证 刚开始在纠结怎么让整个过程循环起来,什么循环放到最外层,其实就是一个循环,看来自己的循环练习的还是不够多,不够灵活 ...

  6. CSS动画效果之animation

    Y(^o^)Y css动画大乱弹之animation. 概述 什么是animation呢?在回答这个问题之前,先要说明什么叫做@keyframe(关键帧).@keyframe算是一个动画模板.在其中, ...

  7. c++的重载 缺省参数和命名空间详解

    参加了几次笔试,发现有很多c++方面的问题被卡了.从现在开始进攻c++.之后会陆续更新c++学习笔记. 先说说我学习的书籍,大家如果有好的书籍推荐,感谢留言. 暂时是在看这些书自学. 1.C++介绍. ...

  8. Stack Overflow访问问题的处理

    一直以来都有访问stackoverflow的习惯,但是老是因为js的问题让人很多操作都操作不了,而且打开的速度也很慢. 原因其实就是stackoverflow使用的google的cdn,于是想彻底一点 ...

  9. yocto-sumo源码解析(十): ProcessServer.idle_commands

    这一节开始介绍ProcessServer.idle_commands,前面我们知道ProcessServer.main就是不停调用idle_commands()以获取可用的套接字描述符或者是文件描述符 ...

  10. Hyperledger Fabric MSP Identity Validity Rules——MSP身份验证规则

    MSP Identity Validity Rules——MSP身份验证规则 正如Hyperledger Fabric Membership Service Providers (MSP)——成员服务 ...