2019 Nowcoder Multi-University Training Contest 4 E Explorer
线段树分治。
把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边。
注意把左右端点的关系。
#include <bits/stdc++.h> const int N = 2e5 + ;
int X[N], Y[N], top; struct DSU {
int fa[N], sz[N];
int find(int x) {
while (x != fa[x]) x = fa[x];
return x;
}
void merge(int x, int y) {
x = find(x), y = find(y);
if (x == y) return;
if (sz[x] > sz[y]) std::swap(x, y);
sz[y] += sz[x]; fa[x] = y;
X[++top] = x;
Y[top] = y;
}
void undo(int last) {
for (; top > last; top--) {
sz[Y[top]] -= sz[X[top]];
fa[X[top]] = X[top];
}
}
void clear(int n) {
for (int i = ; i <= n; i++)
fa[i] = i, sz[i] = ;
}
} dsu; int a[N], cnt, n, m, ans; struct Node {
int u, v, x, y;
}; void solve(int l, int r, const std::vector<Node> &vec) {
if (vec.empty()) return;
int temp = top, mid = l + r >> ;
std::vector<Node> L, R;
for (auto p: vec) {
if (p.x <= l && p.y >= r) {
dsu.merge(p.u, p.v);
} else {
if (p.x <= mid) L.push_back(p);
if (p.y > mid) R.push_back(p);
}
}
if (dsu.find() == dsu.find(n)) {
/*if (l == 4) {
for (int i = 1; i <= top; i++)
printf("%d %d\n", X[i], Y[i]);
}*/
ans += a[r] - a[l - ];
dsu.undo(temp);
return;
}
if (l == r) {
dsu.undo(temp);
return;
}
solve(l, mid, L);
solve(mid + , r, R);
dsu.undo(temp);
} int main() {
freopen("in.txt", "r", stdin);
std::vector<Node> vec;
scanf("%d%d", &n, &m);
vec.resize(m);
for (int i = ; i < m; i++) {
scanf("%d%d%d%d", &vec[i].u, &vec[i].v, &vec[i].x, &vec[i].y);
a[cnt++] = vec[i].x - , a[cnt++] = vec[i].y;
}
a[cnt++] = ;
std::sort(a, a + cnt);
cnt = std::unique(a, a + cnt) - a;
for (int i = ; i < m; i++) {
vec[i].x = std::lower_bound(a, a + cnt, vec[i].x) - a;
vec[i].y = std::lower_bound(a, a + cnt, vec[i].y) - a;
}
dsu.clear(n);
solve(, cnt - , vec);
printf("%d\n", ans);
return ;
}
2019 Nowcoder Multi-University Training Contest 4 E Explorer的更多相关文章
- 2019 Multi-University Training Contest 8
2019 Multi-University Training Contest 8 C. Acesrc and Good Numbers 题意 \(f(d,n)\) 表示 1 到 n 中,d 出现的次数 ...
- 2019 Multi-University Training Contest 7
2019 Multi-University Training Contest 7 A. A + B = C 题意 给出 \(a,b,c\) 解方程 \(a10^x+b10^y=c10^z\). tri ...
- 2019 Multi-University Training Contest 1
2019 Multi-University Training Contest 1 A. Blank upsolved by F0_0H 题意 给序列染色,使得 \([l_i,r_i]\) 区间内恰出现 ...
- 2019 Multi-University Training Contest 2
2019 Multi-University Training Contest 2 A. Another Chess Problem B. Beauty Of Unimodal Sequence 题意 ...
- 2019 Multi-University Training Contest 5
2019 Multi-University Training Contest 5 A. fraction upsolved 题意 输入 \(x,p\),输出最小的 \(b\) 使得 \(bx\%p&l ...
- HDU校赛 | 2019 Multi-University Training Contest 6
2019 Multi-University Training Contest 6 http://acm.hdu.edu.cn/contests/contest_show.php?cid=853 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 5
2019 Multi-University Training Contest 5 http://acm.hdu.edu.cn/contests/contest_show.php?cid=852 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 4
2019 Multi-University Training Contest 4 http://acm.hdu.edu.cn/contests/contest_show.php?cid=851 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 3
2019 Multi-University Training Contest 3 http://acm.hdu.edu.cn/contests/contest_show.php?cid=850 100 ...
随机推荐
- 第22课 weak_ptr弱引用智能指针
一. weak_ptr的概况 (一)weak_ptr的创建 1. 直接初始化:weak_ptr<T> wp(sp); //其中sp为shared_ptr类型 2. 赋值: wp1 = sp ...
- 解决WebBrowser控件会导致应用程序占用内存居高不下问题
WebBrowser 是一个 .NET 控件类,在 .NET Framework 2.0 版中新增.WebBrowser 类使用户可以在窗体中导航网页,下面我们来看在开发中碰到WebBrowser控件 ...
- python运维开发常用模块(四)文件对比模块difflib
1.difflib介绍 difflib作为 Python的标准库模块,无需安装,作用是对比文本之间的差异,且支持 输出可读性比较强的HTML文档,与Linux下的diff命令相似.我们可以 使用dif ...
- 调用其他python脚本文件里面的类和方法
问题描述: 自己编写了若干个Python脚本. 在testC.py里面需要调用testA.py和testB.py里面的若干类和方法.要怎么办? 需要都打包.安装,再去调用吗? 其实不必那么麻烦. 这里 ...
- oracle数据库安装过程中的疑惑—该记录是本人以前写在微博上的文章
转行IT初学者关于oracle数据库整理第一次安装数据库的时候都是按照操作步骤一步一步进行安装,并没有对操作步骤产生过怀疑或者为什么要这么进行操作?2017年12月8日再次阅读安装操作说明书的时候有了 ...
- 奥展项目笔记02--一个bat文件运行多个java jar包
奥展项目中后端微服务有很多jar包,一个一个启动又费时间效率又低,怎么才能一下让所有的jar包一块运行呢?我们可以编写.bat文件来一键启动. 1.我们将.bat文件放到jar包的同一级目录文件夹中: ...
- javascript去除字符串中的空格
使用JavaScript去除字符串的空格,可以有两种方法,一种是使用replace()方法将空格(空白符)替换为空串,一种就是使用trim()方法去除字符串两端的空白字符. replace()方法 r ...
- tk.mybatis 中一直报...table doesn't exists
首先检查你在实体类中可有加上@Table(name="数据库中的表名") 第二:如果你加了@Table注解, 那么只有一种可能就是.xml中定义了与通用mapper中的相同的方法名 ...
- 脱离 WebView 的通信 JavaScriptCore
JavascriptCore JavascriptCore 一直作为 WebKit 中内置的 JS 引擎使用,在 iOS7 之后,Apple 对原有的 C/C++ 代码进行了 OC 封装,成为系统级的 ...
- Linux进程启动/指令执行方式研究
1. 通过glibc api执行系统指令 0x1:system() glibc api system是linux系统提供的函数调用之一,glibc也提供了对应的封装api. system函数的原型为: ...