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 ...
随机推荐
- android 自定义gridview(导航)
最近又重新做回安卓,做了个小项目.下绝心使用android studio,通过这一回实战,终于用上了.综合了前人的经验,搞了个自己满意的导航界面,用的是gridview. 代码: package co ...
- sentry之二:sentry配置钉钉和email
springboot+springcloud后台项目配置日志采集 gradle: compile 'com.getsentry.raven:raven-logback:8.0.2' compile ' ...
- 折腾linux随笔 之 关闭Budgie默认自动隐藏应用的菜单栏 与 Gnome系桌面应用菜单无内容解决
关闭Budgie默认自动隐藏应用菜单栏 首选项 -> 设置 -> 通用辅助功能 -> 打开 始终显示通用辅助菜单 后的开关 -> 注销桌面重新登录. done. 解决Gnome ...
- k8s网络原理
https://blog.csdn.net/watermelonbig/article/details/80646988 k8s中,每个 Pod 都有一个独立的 IP 地址,所有 Pod 在一个网络空 ...
- Dozer JAVA的POJO 映射工具
Dozerhttp://www.manongjc.com/article/50949.html JAVA的映射工具 BeanUtils dozer的使用方法https://blog.csdn.net/ ...
- ServiceStack.Redis简单封装
首先创建RedisConfig配置类 #region 单例模式 //定义单例实体 private static RedisConfig _redisConfig = null; /// <sum ...
- 添加wcf服务引用,无法签出当前文件
写了一些wcf服务接口,使用控制台可以正常启动服务,想要测试一下,新建项目添加服务引用,提示:“无法签出当前文件.该文件可能为只读或已锁定,或者您需要手动签出它.” 在网上找了找,有说可能是因为源代码 ...
- topshelf注册服务
1.需要从nutget上获取toshelf配置 2.代码 using Common.Logging; using Quartz; using Quartz.Impl; using System; us ...
- 微信小程序环境配置和开发!!
1.登陆微信公众平台小程序,下载 普通小程序开发者工具.或者 小游戏开发者工具. 2.新建项目需要填以下几点,然后初始demo如下,注意rpx是分成750份的单位. 3.点击预览,用微信扫描二维码,代 ...
- vue自带开发环境,生产环境,自己搭建测试环境
git 码云地址: https://gitee.com/qichangshui_admin/vueAddTest 参考地址: https://www.jianshu.com/p/bfcfe5fc253 ...