「CSA72」MST

题目大意:有一个大小为 \(n\) 的无向完全图,\(x, y\) 之间的边权值为 \(a[\min(x,y)][\max(x,y)]\) ,初始为0,进行 \(m\) 次修改,每次将一个矩形的权值加上 \(w\) ,求出最后这张完全图的最小生成树的边权和。\(n,m \leq 100000\)。

解题思路:用 Borůvka 求最小生成树,每一轮求出每一个点所在联通块向外连的一条边权最小的边,并用线段树+扫描线维护最小值以及最小值所在的联通块编号。为了找到不在同一个联通块内的边权最小的边,所以额外记一个次小值,并时刻保证次小值所在的联通块编号与最小值不是同一个,那么要连出去的最小的边一定在这两者之间,总复杂度 \(O(nlog^2n)\)。

code

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf ((ll)(1e16))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T & x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
} #define par pair<ll, ll>
#define fi first
#define se second const int N = 100005; struct chino{ int t, l, r, w; } q[N<<2];
int fa[N], n, m, tot, cnt; ll ans;
par tmp[N]; inline int ask(int x){ return x == fa[x] ? x : fa[x] = ask(fa[x]); }
struct Node{
int id[2]; ll val[2];
inline Node(){ val[0] = val[1] = inf, id[0] = id[1] = 0; }
inline Node operator + (const int &w){
Node res = *this;
return res.val[0] += w, res.val[1] += w, res;
}
inline Node operator + (const Node &A){
Node res, rhs;
res = (val[0] < A.val[0] ? *this : A);
rhs = (val[0] < A.val[0] ? A : *this);
for(int i = 0; i < 2; i++)
if(ask(rhs.id[i]) != ask(res.id[0]) && rhs.val[i] < res.val[1])
res.val[1] = rhs.val[i], res.id[1] = rhs.id[i];
return res;
}
};
namespace Seg{
#define lson (u << 1)
#define rson (u << 1 | 1)
#define mid (l + r >> 1)
Node mn[N<<2]; ll tag[N<<2];
inline void build(int u, int l, int r){
tag[u] = 0;
if(l == r){
mn[u].val[0] = 0, mn[u].val[1] = inf;
mn[u].id[0] = l, mn[u].id[1] = 0; return;
}
build(lson, l, mid), build(rson, mid + 1, r);
mn[u] = mn[lson] + mn[rson];
}
inline void pushdown(int u){
if(!tag[u]) return;
mn[lson] = mn[lson] + tag[u], mn[rson] = mn[rson] + tag[u];
tag[lson] += tag[u], tag[rson] += tag[u], tag[u] = 0;
}
inline void change(int u, int l, int r, int L, int R, ll w){
if(l >= L && r <= R) return (void) (mn[u] = mn[u] + w, tag[u] += w);
pushdown(u);
if(L <= mid) change(lson, l, mid, L, R, w);
if(mid < R) change(rson, mid + 1, r, L, R, w);
mn[u] = mn[lson] + mn[rson];
}
} inline void Bruasolve(){
Seg::build(1, 1, n);
for(register int i = 1; i <= n; i++) tmp[i].fi = inf, tmp[i].se = 0;
int p = 1;
for(register int i = 1; i <= n; i++){
while(p <= cnt && q[p].t == i)
Seg::change(1, 1, n, q[p].l, q[p].r, q[p].w), p++;
Node x = Seg::mn[1];
par now = (ask(x.id[0]) != ask(i)) ? make_pair(x.val[0], x.id[0]) : make_pair(x.val[1], x.id[1]);
if(now.fi < tmp[ask(i)].fi) tmp[ask(i)] = now;
}
for(register int i = 1; i <= n; i++) if(fa[i] == i){
if(ask(tmp[i].se) != i && tmp[i].se) tot++, ans += tmp[i].fi, fa[ask(tmp[i].se)] = i;
}
} inline bool cmp(const chino &A, const chino &B){ return A.t < B.t; } signed main(){
read(n), read(m);
for(int i = 1, X1, X2, Y1, Y2, w; i <= m; i++){
read(X1), read(X2), read(Y1), read(Y2), read(w);
q[++cnt] = ((chino){X1, Y1, Y2, w});
q[++cnt] = ((chino){X2 + 1, Y1, Y2, -w});
q[++cnt] = ((chino){Y1, X1, X2, w});
q[++cnt] = ((chino){Y2 + 1, X1, X2, -w});
}
sort(q + 1, q + cnt + 1, cmp);
for(int i = 1; i <= n; i++) fa[i] = i;
while(tot < n - 1) Bruasolve(); cout << ans << endl;
return 0;
}

「CSA72」MST的更多相关文章

  1. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  2. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  7. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  8. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  9. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

随机推荐

  1. 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包

    [题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...

  2. Spring Boot微服务框架的搭建

    (1)spring boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  3. ES6基础知识汇总

    1.如何理解ECMAScript6? ECMAScript是什么,ECMASCript的作用 2.新增let关键字 let的用途 3.关键字const const作用,传址赋值 4.解构赋值 解构赋值 ...

  4. html中插入其他html,并实现动态效果!

    <html> <body> 倒计时开始...... <span id="s1">888</span> <!--在html中先做 ...

  5. ThinkPHP自定义错误页面、成功页面及异常页面

    为什么会选择 ThinkPHP 呢?首先,作为一款国产PHP框架,文档肯定比国外那些框架要丰富的多,而且容易看懂:其次,ThinkPHP已经发展了七八年的时间了,相对来说已经比较成熟了:当然,最重要的 ...

  6. perl6 struct2-045 EXP

    测试站点: http://www.yutian.com.cn/index.action http://www.hjxzyzz.com:8088/pfw/login.action 代码如下: use v ...

  7. Linux端口占用

    1.netstat netstat -anp | grep 23232 Sample: [root@BICServer 0825]# netstat -anp | grep 23232 tcp 0 0 ...

  8. SPI最大传输速率【转】

    转自:https://www.silabs.com/community/mcu/8-bit/knowledge-base.entry.html/2017/01/13/spi_-asc0 问题 SPI作 ...

  9. BZOJ 3958 Mummy Madness

    Problem BZOJ Solution 算法:二分+扫描线 快要2019年了,就瞎写一篇博客来凑数,不然感觉太荒凉了-- 答案是可二分的,那么二分的依据是什么呢?不妨设当前二分的答案为\(mid\ ...

  10. QWT编译、配置、使用(Qt Creator)

    环境: Win7 32 bit / Qt Creator 3.3.1 / Qt 5.4.1 (msvc2013_opengl, 32 bit) / QWT 6.1.2 QWT, Qt Widgets ...