BZOJ 2177 [曼哈顿最小生成树]

曼哈顿距离最小生成树与莫队算法 一、曼哈顿距离最小生成树 曼哈顿距离最小生成树问题可以简述如下: 给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价。 朴素的算法可以用O(N2)的Prim,或者处理出所有边做Kruskal,但在这里总边数有O(N2)条,所以Kruskal的复杂度变成了O(N2logN)。 但是事实上,真正有用的边远没有O(N2)条。我们考虑每个点会和其他一些什么样的点连 阅读详情

Description

平面坐标系xOy内,给定n个顶点V=(x,y)。对于顶点u,v,u与v之间的距离d定义为|xu–xv|+|yu–yv| 。你的任务就是求出这n个顶点的最小生成树。

Solution

把平面划分为八个区域以后只有这八个区域的最近点与该点的连边在Kruscal中有贡献。
找到这八个点只要用树状数组维护一下即可。

好像很妙的方法。
有一个地方要去重,不然会WA

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 101010;
const int INF = 2147483647;

inline char get(void) {
    static char buf[100000], *S = buf, *T = buf;
    if (S == T) {
        T = (S = buf) + fread(buf, 1, 100000, stdin);
        if (S == T) return EOF;
    }
    return *S++;
}
inline void read(int &x) {
    static char c; x = 0; int sgn = 0;
    for (c = get(); c < '0' || c > '9'; c = get()) if (c == '-') sgn = 1;
    for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0';
    if (sgn) x = -x;
}

struct Point {
    int x, y, id;
    Point (int _x = 0, int _y = 0, int i = 0):x(_x), y(_y), id(i) {}
    inline friend bool operator <(const Point &a, const Point &b) {
        return a.x == b.x ? a.y < b.y : a.x < b.x;
    }
    inline void Ref(int dir) {
        if (dir & 1) swap(x, y);
        else if (dir == 2) x = -x;
    }
};
struct node {
    int pos, key;
    node (int p = 0, int k = 0):pos(p), key(k) {}
};
struct edge {
    int from, to, key;
    edge(int f = 0, int t = 0, int k = 0):from(f), to(t), key(k) {}
    inline friend bool operator <(const edge &a, const edge &b) {
        return a.key < b.key;
    }
};
node C[N];
Point P[N];
edge G[N << 3];
int n, pos, Gcnt, cnt;
long long ans;
int mp[N], v[N];
int fa[N], rk[N];

inline int lowbit(int x) {
    return x & -x;
}
inline void Modify(int x, int key, int pos) {
    for (; x; x -= lowbit(x))
        if (C[x].key > key)
            C[x] = node(pos, key);
}
inline int Query(int x) {
    int key = INF, pos = -1;
    for (; x <= n; x += lowbit(x))
        if (C[x].key < key) {
            key = C[x].key; pos = C[x].pos;
        }
    return pos;
}
inline int Abs(int x) {
    return x < 0 ? -x : x;
}
inline int Dis(const Point &a, const Point &b) {
    return Abs(a.x - b.x) + Abs(a.y - b.y);
}
inline int F(int x) {
    return fa[x] == x ? x : fa[x] = F(fa[x]);
}
inline bool Merge(int x, int y) {
    static int f1, f2;
    f1 = F(x); f2 = F(y);
    if (f1 == f2) return false;
    if (rk[f1] > rk[f2]) swap(f1, f2);
    if (rk[f1] == rk[f2]) rk[f2]++;
    fa[f1] = f2; return true;
}
inline bool cmp(const int a, const int b) {
    return v[a] < v[b];
}
inline void AddEdge(int from, int to, int key) {
    G[++Gcnt] = edge(from, to, key);
}

int main(void) {
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
    read(n);
    for (int i = 1; i <= n; i++) {
        read(P[i].x); read(P[i].y);
        P[i].id = i; fa[i] = i;
    }
    for (int dir = 0; dir < 4; dir++) {
        for (int i = 1; i <= n; i++) P[i].Ref(dir);
        sort(P + 1, P + n + 1);
        for (int i = 1; i <= n; i++) {
            mp[i] = i; v[i] = P[i].y - P[i].x;
            C[i] = node(-1, INF);
        }
        sort(mp + 1, mp + n + 1, cmp);
        cnt = 0; mp[n + 1] = INF;
        for (int i = 1; i <= n; i++) {
            ++cnt;
            while (v[mp[i]] == v[mp[i + 1]]) v[mp[i++]] = cnt;
            v[mp[i]] = cnt;
        } // 离散去重
        for (int i = n; i; i--) {
            pos = Query(v[i]);
            if (~pos) AddEdge(P[i].id, P[pos].id, Dis(P[i], P[pos]));
            Modify(v[i], P[i].x + P[i].y, i);
        }
    }
    sort(G + 1, G + Gcnt + 1);
    for (int i = 1; i <= Gcnt; i++) {
        if (Merge(G[i].from, G[i].to)) {
            n--; ans += G[i].key;
            if (n == 1) break;
        }
    }
    cout << ans << endl;
}

Xilinx Blockset Counter计数器模块使用及参数配置 本文详细介绍了Simulink中Xilinx Blockset库Counter模块的使用以及参数说明。 阅读详情

相关推荐

无线图像传输新突破:深度JSCC算法在低带宽环境下的性能实测

本文深入探讨了基于深度学习的信源信道联合编码(JSCC)算法在低带宽无线图像传输中的突破性表现。通过实测数据对比,深度JSCC在低信噪比环境下展现出卓越的鲁棒性,有效对抗传统方案的“悬崖效应”,实现图像质量的平滑下降,为远程医疗、工业巡检等严苛场景提供了新的解决方案。

weixin_29090089的博客 504

bzoj 2277 [Poi2011]Strongbox 数论

2277: [Poi2011]Strongbox Time Limit:60 SecMemory Limit:32 MBSubmit:527Solved:231[Submit][Status][Discuss] Description Byteasar is a famous safe-cracker, who renounced his criminal activ...

weixin_30292843的博客 273

植物叶绿体基因组分析全攻略:从共线性到密码子偏好性

本文全面解析植物叶绿体基因组分析流程,从共线性分析到密码子偏好性研究。详细介绍了叶绿体基因组结构特征、测序数据获取与质量控制、基因组组装与注释方法,以及比较基因组学和进化分析技术。特别关注IR区边界变异分析和选择压力评估,为植物系统发育研究和物种鉴定提供实用指南。

weixin_28475533的博客 221

BZOJ 2177: 曼哈顿最小生成树 曼哈顿最小生成树

2177: 曼哈顿最小生成树 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 281  Solved: 117 [Submit][Status][Discuss] Description 平面坐标系xOy内,给定n个顶点V = (x , y)。对于顶点u、v,u与v之间的距离d定义为|xu – xv| + |yu – yv|  你的

BlackJack 1239

【语音识别算法】深度学习语音识别算法与传统语音识别算法的区别、对比及联系

深度学习语音识别算法与传统语音识别算法在理论基础、实现方式、性能表现等方面存在显著区别,同时也有一些联系。下面将从几个方面详细比较这两种方法,并给出应用实例和代码示例。

weixin_51306394的博客 2566

Stm32L0 STM32CUBE中UART和使用LPUART1以及串口不进中断问题解决

/* 开启串口1中断 */ LL_USART_EnableIT_RXNE(LPUART1); /* 开启串口2中断 */ LL_USART_EnableIT_RXNE(USART2);

シ❤゛甜虾的个人博客 7686

BZOJ.2177.曼哈顿最小生成树(Kruskal)

\(Solution\) 参考 对于每个点,向唯一有可能与它形成MST的8个点连边,由于是双向单边,所以每个点最多连出4条边(证明见blog) 怎么找到一个区域内最近的点? 只考虑y轴右侧45°的区域,其余部分可以通过坐标变换移动到这一区域 设当前点P(x0,y0),这一区域一点P1(x1,y1),满足x1>x0 && y1-x1>y0-x0 那么dis(AB)= y1...

weixin_30345055的博客 124

安卓app逆向破解脱壳教程

From:Hook 神器家族的 Frida 工具使用详解:https://blog.youkuaiyun.com/FlyPigYe/article/details/90258758 详解 Hook 框架 frida (信抢红包):https://www.freebuf.com/company-information/180480.html APP逆向神器之Frida【Android初级篇】:https://www.jianshu.com/p/2d755beb1c54 frida 官网文档:https://fr..

sinat_28371057的博客 2万+

知识点 - 曼哈顿距离最小生成树

知识点 - 曼哈顿距离最小生成树 解决问题类型: 求解曼哈顿距离上的最小生成树 前置知识 曼哈顿距离:给定二维平面上的N个点,在两点之间连边的代价。(即distance(P1,P2)=∣x1-x2∣+∣y1-y2∣distance(P1,P2) = |x1-x2|+|y1-y2|distance(P1,P2)=∣x1-x2∣+∣y1-y2∣) 曼哈顿距离最小生成树问题求什么?求使所有点连通...

qq_41848675的博客 992

Halcon实战:5分钟搞定金属表面划痕检测(附完整代码解析)

本文提供了一份基于Halcon的金属表面划痕检测实战指南。通过核心的动态阈值算法,快速从图像中提取局部对比度异常区域,并结合形态学后处理与特征筛选,精准识别划痕。文章详解了从代码搭建、参数优化到工业场景适配的全流程,帮助工程师在五分钟内构建稳定高效的机器视觉检测方案。

weixin_29084231的博客 495

Java全栈:电影数据检索与推荐系统实战

全文检索个性化推荐数据缓存容器化部署通过这个项目,我们不仅实践了Java全栈开发的各项技术,还接触了推荐系统的核心算法实现。用户历史行为数据物品特征数据上下文信息实时反馈算法的准确性推荐的多样性系统的实时性冷启动问题性能优化效果评估VIEW, // 浏览CLICK, // 点击SEARCH, // 搜索RATE, // 评分COMMENT, // 评论SHARE, // 分享WATCH_TIME, // 观看时长。

exlink2012的专栏 890

51NOD 1213 二维曼哈顿距离最小生成树

因为是二维平面图,所以点很多,如果全部点都连边,将有N*(N+1)/2条边,数组肯定存不下,所以要想办法减少边数。题目要求的是最小生成树的权值,又是曼哈顿距离,可以发现,对于平面上的某个点,以该点为原点建立直角坐标系,则我们只需要连接四个象限中每个象限离它最近的那个点即可,所以边的数量减少到4*N。 对于每个点,用树状数组维护每个象限离它的最近的那个点的权值就好了#include <map> #i

RCY_ZHU的博客 446

【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用

【图像超分】论文精读:Image Super-Resolution Using Deep Convolutional Networks(SRCNN)请配合上述论文精读文章使用,效果更佳!图像超分辨率SRCNN和FSRCNN复现代码,除基本的网络实现外,还有特征图可视化,PSNR曲线图可视化,测试自己的图像数据等不想理解原理,希望直接跑通然后应用到自己的图像数据的同学,请直接下载上面的代码,有训练好的模型,直接用即可。具体使用方式见代码中的README!有问题来本文评论区留言!准备数据集,以及数据预处理。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

BZOJ 2177: 曼哈顿最小生成树

Sol 考了好几次曼哈顿最小生成树,然而一直不会打...这次终于打出来了...神tm调试了2h...好蛋疼... 首先曼哈顿最小生成树有个结论就是讲它每45度分出一个象限,对于每个点,只与每个象限中离他最近的点连线,做最小生成树,就是他们的曼哈顿最小生成树. 关于证明,先让我想想再来补. 我们的问题两个方面:为什么将平面分成8块;为什么只需要连接每块中距离最小的点. 不过好像没...

aisen1985的博客 235

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

bzoj2177/51nod-1213 曼哈顿距离最小生成树

算法分析对不起我写这个的时候我们国庆节只放了一天假,所以我精神有点不正常…大家忽略一些不太对的东西即可。原理分析曼哈顿距离:对于两点p1(x1,y1),p2(x2,y2),它们之间的曼哈顿距离为|x1-x2|+|y1-y2| 那么如何迅速地求曼哈顿距离最小生成树呢?我们找到一个点p1,然后以它为原点建立坐标轴,那么它只需要与这八个区域里的每个区域和它曼哈顿距离最近的点连一条边即可。 这是为什

litble的成(tui)长(fei)史 760

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[BZOJ2177][最小/最大(曼哈顿距离)生成树]曼哈顿最小生成树

题意给定平面内一些点,求最小曼哈顿距离生成树看这篇咯http://blog.youkuaiyun.com/acm_cxlove/article/details/8890003#include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> #define N 100010 #define

CE玩家 2573

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【BZOJ-2177】曼哈顿最小生成树 Kruskal + 树状数组

2177: 曼哈顿最小生成树 Time Limit:10 SecMemory Limit:259 MBSubmit:190Solved:77[Submit][Status][Discuss] Description 平面坐标系xOy内,给定n个顶点V = (x , y)。对于顶点u、v,u与v之间的距离d定义为|xu – xv| + |yu – yv|你的任务就是求...

weixin_30322405的博客 124

BZOJ 2177 最小曼哈顿生成树

留板。 #include using namespace std; typedef pair pii; const int maxn=100005; const long long inf=0x3f3f3f3f3f3f3f3f; int n,pos[maxn],f[maxn]; long long bit[maxn],res,x,y; struct edge { int u,v;

亂丟程式碼的天空 450

HDU - 6187 最大生成树

要想每一个地方都到达,那么肯定没环,所以就是去掉环中最小的一条边,反过来就是保留所有大的边,也就是最大生成树。 #include&lt;iostream&gt; #include&lt;algorithm&gt; using namespace std; const int maxn=2e5+10; struct node{ int u,v,w; }g[maxn]; int f...

兜率工的博客 308

图论 —— 生成树 —— 曼哈顿距离最小生成树

【概述】 当给出一些二维平面的点时,记两点间距离为曼哈顿距离,此时的最小生成树,称为曼哈顿最小距离生成树。 对于 n 个点来说,最朴素的做法是暴力求出所有所有点两两之间的曼哈顿距离,然后再跑最小生成树算法,以得到曼哈顿最小距离生成树,但这样来做,由于总边数有 n^2 条,时间复杂度会达到 O(n^3) 或 O(n^2 logn) 对于 Kruskal 来说,针对这种曼哈顿距离的 MST 问题...

Alex_McAvoy的博客 4207

bzoj256最小生成树

易水人去,明月如霜。 Description  给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树上?   Input   第一行包含

LjcoderDCC的博客 336

曼哈顿距离最小生成树

一、前人种树 博客:曼哈顿距离最小生成树与莫队算法 博客:学习总结:最小曼哈顿距离生成树 二、知识梳理 曼哈顿距离:给定二维平面上的N个点,在两点之间连边的代价。(即distance(P1,P2) = |x1-x2|+|y1-y2|) 曼哈顿距离最小生成树问题求什么?求使所有点连通的最小代价。 最小生成树的“环切”性质:在图G = (V, E)中,如果存在一个环,那么把环上的最大...

weixin_34019144的博客 337

曼哈顿最小生成树

1、poj 3241 Object Clustering   题意:平面上有n个点,点之间的距离采用曼哈顿距离衡量。求一个最小距离X,使得在把这些点分为k组后,每组中两两点之间的距离不超过X。   思路:首先我们这么想,如果所有点都在1个组中,即k=1时,那么所要求的X即为该n个点的曼哈顿最小生成树的最大边;当k=2时,如果我们将最小生成树的最大边割开,形成2组,答案仍未原最小生成树的第2大的...

weixin_34001430的博客 260

【BZOJ2521】【SHOI2010】最小生成树(最小割)

DescriptionSecsa最近对最小生成树问题特别感兴趣。他已经知道如果要去求出一个n个点、m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法。另外,他还知道,某一个图可能有多种不同的最小生成树。例如,下面图 3中所示的都是图 2中的无向图的最小生成树:当然啦,这些都不是今天需要你解决的问题。Secsa想知道对于某一条无向图中的边AB,至少需要多少代价可以保证AB边在这个

(■-■) 469

曼哈顿最小生成树【模板题】

模板题:POJ 3241 曼哈顿最小生成树:给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价。朴素的算法可以用O(N2)的Prim,或者处理出所有边做Kruskal,但在这里总边数有O(N2)条,所以Kruskal的复杂度变成了O(N2logN)。 结论:以一个点为原点建立直角坐标系,在每45度内只会向距离该点最近的一个点连边。(注意距离均为曼哈顿距离) ...

qq_42211531的博客 698

BZOJ 2467 生成树

题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2467 分析 手动操作一遍可发现,得到的生成树一定是一个五边形删去两条边且其中一条是底边,另外 N−1N - 1N−1 个五边形各删去一条边,所以结果为 4∗N∗5N−14 * N * 5 ^ {N - 1}4∗N∗5N−1 AC代码 #include <cstdio> co...

Kevin的博客 344
上一篇: 2016.1 听课笔记
下一篇: BZOJ 1188 [SG定理][博弈论]
Vectorxj
博客等级 码龄11年 35粉丝 231原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值