博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4666 Hyperspace(优先队列)
阅读量:6503 次
发布时间:2019-06-24

本文共 1757 字,大约阅读时间需要 5 分钟。

题目链接:

题意:两种操作:(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());
        }
    }
}

转载地址:http://domyo.baihongyu.com/

你可能感兴趣的文章
spring-aop
查看>>
android RecycleView Adapter简单封装
查看>>
PgSQL · 案例分享 · 递归收敛优化
查看>>
Dart的数据库操作
查看>>
Codeforces 591 B Rebranding【Codeforces Round #327 (Div. 2)】
查看>>
命名难,难于上青天
查看>>
做完和做好不一样
查看>>
APUE读书笔记-05标准输入输出库(7)
查看>>
23 第一周作业
查看>>
DNS解析偶尔延迟
查看>>
iOS打电话,发短信,发邮件,打开网址
查看>>
响应者链
查看>>
06-验证码-基本功能实现
查看>>
Java数据结构与算法(六) 希尔排序
查看>>
Winform程序窗体间的跳转
查看>>
canvas学习笔记
查看>>
IntelliJ Idea下Go项目开启Debug调试
查看>>
elasticsearch安装步骤
查看>>
PHP获取Cookie模拟登录CURL(转)
查看>>
PHP-权限控制类(转)
查看>>