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 ...
随机推荐
- Helm 常用命令及操作
Helm 常用命令 查看版本 #helm version 查看当前安装的charts #helm list 查询 charts #helm search redis 安装charts #helm in ...
- JAVA8之StringJoiner
作用:运用了StringBuilder的一个拼接字符串的封装处理 示例: StringJoiner sj = new StringJoiner("-", "[" ...
- 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用
原文出处: 吴秦的博客 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学 ...
- CSS属性相关知识
Css选择器 选择器的权重 在css中,哪个选择器的权重高,就走谁的样式. 标签选择器的权重是 1 Class选择器的权重是10 Id选择器的权重是100 行间样式的权重是1000 带有关键字 !im ...
- CopyOnWriteArrayList 源码分析 基于jdk1.8
CopyOnWriteArrayList 源码分析: 1:成员属性: final transient ReentrantLock lock = new ReentrantLock(); //内部是 ...
- Redis 内存管理 源码分析
要想了解redis底层的内存管理是如何进行的,直接看源码绝对是一个很好的选择 下面是我添加了详细注释的源码,需要注意的是,为了便于源码分析,我把redis为了弥补平台差异的那部分代码删了,只需要知道有 ...
- windows环境下 mysql 忘记root密码时的解决办法
1,停止MYSQL服务,CMD打开DOS窗口,输入 net stop mysql 2,在CMD命令行窗口,进入MYSQL安装目录 比如E:\Program Files\MySQL\MySQL Serv ...
- WPF MainWindow的TopMost,Resizemode
Topmost -[true,false] The default is false, but if set to true, your Window will stay on top of othe ...
- C# 文件监听类 FileSystemWatcher 属性
属性: Path——这个属性告诉FileSystemWatcher它需要监控哪条路径.例如,如果我们将这个属性设为“C:Temp”,对象就监控那个目录发生的所有改变.IncludeSubDirecto ...
- C#专业的音视频采集录制类库SharpCapture介绍
SharpCapture是高性能.轻量级.接口清晰.使用简单的C#语言编写的.NET音视频采集.屏幕录制类库.本类库可以采集系统声卡.麦克风.摄像头.屏幕画面,支持声卡和话筒混音采集. 可以应用到直播 ...