题目链接: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(优先队列)相关推荐

  1. hdu 4666 Hyperspace

    点击打开hdu 4666 思路:n维空间计算最远的曼哈顿距离 分析: 1 这一题和poj2926很像,但是poj那题是静态的而这边则是动态的,对于静态的话我们知道只要去求出2^n状态下的最大值和最小值 ...

  2. HDU 4666 Hyperspace【最远曼哈顿距离+优先队列】

    这个题是动态的求最远曼哈顿距离.做法和POJ 2926 Requirements一样,都是通过二进制枚举符号的情况. 每插入一个节点都要询问最大值和最小值,因此用一个优先队列或者堆维护就可以了. #i ...

  3. [HDU 4666]Hyperspace[最远曼哈顿距离][STL]

    题意: 许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果. 思路: 用"疑似绝对值"的思想, 维护每种状态 ...

  4. HDU 4666 Hyperspace(最长曼哈顿距离)

    POJ 2926加强版,使用set处理,, //#pragma comment(linker, "/STACK:102400000,102400000") #include< ...

  5. Hyperspace HDU - 4666

    http://acm.hdu.edu.cn/showproblem.php?pid=4666 动态求最远曼哈顿距离 线段树维护区间最值就好 但是k维空间会有2^k种情况 只能离线每一种情况 最后么一个 ...

  6. HDU 5437by cyl优先队列

    HDU 5437 题意: ​ 有个人要过生日,有k个朋友来拜访,但是他家里实在是有点小,只能依次让朋友进门,有m个特定的时间,每次可以进入p个人,每一个朋友来会带礼物,价值为v.主人还是比较贪心的,他 ...

  7. HDU 幸福列车 优先队列

    幸福列车 一批幸福的列车即将从杭州驶向幸福的终点站――温州,身为总列车长的linle有一些奇怪的癖好. 他会记录下全部乘客的名字(name)和他们的人品值(RP),根据这些将他们排序,并不时地从某辆列 ...

  8. 4666 Hyperspace stl

    当时自己做的时候没有这么想,想的是每个象限去找一个无穷值来作为比较点.但是很麻烦 代码: 1 #include <stdio.h> 2 #include <string.h> ...

  9. 【水题】 HDOJ 4666 Hyperspace

    2009年国家集训队武森论文 最远哈密顿距离...论文题. #include <iostream> #include <queue> #include <stack> ...

最新文章

  1. 酸奶饮料新产品口味测试研究案例
  2. IAR建立stm32工程
  3. 多线程介绍和多线程模块-lock-互斥锁
  4. 回溯的问题合集(Leetcode题解-Python语言)
  5. 力扣长度最小的子数组
  6. JVM JRE JDK,这些东西到底是什么?(转载)
  7. 惠普光影精灵拆机换屏幕_聊聊惠普游戏本大军的“先遣部队”
  8. 极客大学产品经理训练营:产品规划与功能规划 第15课总结
  9. 几款免费PDF合并成一个PDF的软件推荐,快收藏起来吧
  10. 构建一个可行的BI系统的造价是多少,实施周期?具备条件基础是什么? 数据量有要求么
  11. 滤波器截止频率理解?
  12. 蓝桥杯 等差素数列(python实现)
  13. spss分析qpcr数据_qRT-PCR差异分析及P值计算
  14. 思科序列号无服务器,查看思科设备序列号以及序列号的命名格式
  15. Python动态可视化Cufflinks
  16. Web超简单入门(附带项目的讲解)
  17. android使用精伦身份证读卡器读身份证
  18. Windows10如何开启Mysql
  19. 创蓝闪验一键登录(Java实现)
  20. 2021-06-28页面自动跳转

热门文章

  1. nmon结果说明及分析
  2. 如何使用PPT拼图并且导出为各种形式的高清图片
  3. 松雅旅馆(实验三第二题)
  4. IT企业文化の东方通信
  5. n个小球放入m个盒子中_n个球放入m个盒子的几种情形讨论
  6. Webrtc从理论到实践七: 官方demo源码走读(peerconnection_server)
  7. iCore-3588Q 8K人工智能核心板
  8. 使用RecyclerView 简单实现QQ好友列表展开效果
  9. 微信多媒体团队梁俊斌访谈:聊一聊我所了解的音视频技术
  10. 四年巨亏49亿,第四范式四闯IPO