HDU 4666 STL求多维最远曼哈顿距离

简介:
题意: 有Q个操作。 没次操作会增加一个点, 或者删除一个点。 每次输出点集的最大曼哈顿距离。
思路: STL应用
一维就是  Max (x) - Min(x)
就是对于 二维的 x - y   和 x + y 做两个集合。 答案肯定会在  Max( x - y) -  Min( x - y)  或者 是  Max(x + y)  -  Min(x + y)
而三维就是 Max(x + y + z) - Min(x + y + z)  或者是 Max(x + y - z)  - Min(x + y - z) 略。
就是  +-a +- b +- c +- d +- e
把每种情况用二进制表示成一个状态枚举一下就可以了。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
map<int,int>h[35];
map<int,int>::iterator it;
multiset<int>myset[35];
multiset<int>::iterator it2,i1,i2;
const int oo=-1e9;
int ab(int a)
{
    return a<0?-a:a;
}
int main()
{
    int n,k,s,co[8],num,xu;
    while(~scanf("%d%d",&n,&k))
    {
        int od=1<<k;
        for(int i=0; i<od; i++)
            h[i].clear(),myset[i].clear();
        num=1;
        for(int num=1; num<=n; num++)
        {
            scanf("%d",&s);
            if(!s)
            {
                for(int i=0; i<k; i++)scanf("%d",&co[i]);
                for(int i=0; i<od; i++)
                {
                    int ans=0,sym=i;
                    for(int j=0; j<k; j++)
                    {
                        if(sym&1) ans+=co[j];
                        else ans-=co[j];
                        sym>>=1;
                    }
                    h[i][num]=ans;
                    myset[i].insert(ans);
                }
            }
            else
            {
                scanf("%d",&xu);
                for(int i=0; i<od; i++)
                {
                    it=h[i].find(xu);
                    it2=myset[i].find(it->second);
                    myset[i].erase(it2);
                    h[i].erase(it);
                }
            }
            if(h[0].size()==0)
            {
                puts("0");
                continue;
            }
            int ret=oo;
            for(int i=0; i<od; i++)
            {
                i1=myset[i].begin(),i2=myset[i].end();
                i2--;
                ret=max(ret,ab(*i1-*i2));
            }
            printf("%d\n",ret);
        }
    }
    return 0;
}



目录
相关文章
|
存储 算法 C++
C++基础算法离散化及区间合并篇
C++基础算法离散化及区间合并篇
153 0
|
算法 Android开发
LeetCode 周赛上分之旅 #41 结合离散化的线性 DP 问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
74 0
Leetcode动态规划篇(0-1背包问题一维和二维dp实现)
Leetcode动态规划篇(0-1背包问题一维和二维dp实现)
|
算法 测试技术
分治法解二维的最近对问题,算法分析与代码实现,蛮力法与分治法解决二维的最近对问题的区别
分治法解二维的最近对问题,算法分析与代码实现,蛮力法与分治法解决二维的最近对问题的区别
360 0
【LeetCode】移动零&&颜色分类&&有序数组的平方&&有效的山脉数组
【LeetCode】移动零&&颜色分类&&有序数组的平方&&有效的山脉数组
【LeetCode】移动零&&颜色分类&&有序数组的平方&&有效的山脉数组
|
人工智能 算法 C++
区间和 离散化入门与例题· C++
区间和 离散化入门与例题· C++
196 0
区间和 离散化入门与例题· C++
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
107 0
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
HDU7018.Banzhuan(计算几何+贪心)
HDU7018.Banzhuan(计算几何+贪心)
104 0
HDU7018.Banzhuan(计算几何+贪心)
LeetCode每日一题——805. 数组的均值分割
给定你一个整数数组 nums 我们要将 nums 数组中的每个元素移动到 A 数组 或者 B 数组中,使得 A 数组和 B 数组不为空,并且 average(A) == average(B) 。
112 0
|
开发者
膜拜(离散化差分模板题)
题目描述 小鱼有 n 名优秀的粉丝。 粉丝们得知小鱼将会在一条直线上出现,打算去膜他。为了方便,粉丝们在这条直线上建立数轴。 第 i 名粉丝有一个侦查区间[li,ri] 。如果小鱼在 j(li≤j≤ri) 处出现,这名粉丝将立刻发现并膜他。 小鱼希望膜他的人越多越好,但是他不能分身,因此只能选择一个位置出现。 小鱼想知道自己最多能被多少个人膜。
217 0
膜拜(离散化差分模板题)