Solved:3

Rank:261

E Explorer (线段树)

题意:n个点 m条边 每条边只有身高l,r内的人可以穿过 问有几种身高可以从1走到n

题解:把l,r离散化后(左闭右开) 线段树叶子节点维护区间  然后从线段树根节点dfs下去

   这个区间能不能产生贡献的关键在于1和n的联通 所以用可撤销的按秩并查集动态维护信息

   回溯的时候要撤掉并查集 不能对其他子区间产生影响

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5; int n, m, cnt, ans;
int u[MAXN], v[MAXN], b[MAXN << 1];
int l[MAXN], r[MAXN];
int fa[MAXN], zhi[MAXN];
vector<int> g[MAXN << 3]; int find(int x) {
if(fa[x] != x) return find(fa[x]);
else return x;
} void update(int ql, int qr, int x, int l, int r, int rt) {
if(ql <= l && qr >= r) {
g[rt].push_back(x); //表示l,r区间能通过x号边
return;
} int mid = l + r >> 1;
if(ql <= mid) update(ql, qr, x, l, mid, rt << 1);
if(qr > mid) update(ql, qr, x, mid + 1, r, rt << 1 | 1);
} void dfs(int l, int r, int rt) {
vector< pair<int, int> > tmp;
for(int i = 0; i < g[rt].size(); i++) {
int x = u[g[rt][i]], y = v[g[rt][i]];
int fx = find(x), fy = find(y);
if(fx == fy) continue;
if(zhi[fx] < zhi[fy]) fa[fx] = fy, tmp.push_back(make_pair(fx, 0));
else if(zhi[fx] > zhi[fy]) fa[fy] = fx, tmp.push_back(make_pair(fy, 0));
else zhi[fx]++, fa[fy] = fx, tmp.push_back(make_pair(fy, 1));
} if(find(1) == find(n)) {
ans += b[r + 1] - b[l];
} else if(l < r) {
int mid = l + r >> 1;
dfs(l, mid, rt << 1);
dfs(mid + 1, r, rt << 1 | 1);
}
for(int i = tmp.size() - 1; i >= 0; i--) {
zhi[fa[tmp[i].first]] -= tmp[i].second;
fa[tmp[i].first] = tmp[i].first;
}
} int main() {
ans = 0, cnt = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) fa[i] = i, zhi[i] = 0;
for(int i = 1; i <= m; i++) {
scanf("%d%d%d%d", &u[i], &v[i], &l[i], &r[i]);
b[++cnt] = l[i]; b[++cnt] = r[i] + 1;
}
sort(b + 1, b + 1 + cnt);
cnt = unique(b + 1, b + 1 + cnt) - (b + 1); for(int i = 1; i <= m; i++) {
int t1 = lower_bound(b + 1, b + 1 + cnt, l[i]) - b;
int t2 = lower_bound(b + 1, b + 1 + cnt, r[i] + 1) - b;
update(t1, t2 - 1, i, 1, cnt, 1);
}
dfs(1, cnt, 1);
printf("%d\n", ans);
return 0;
}

E Explorer

最新文章

  1. Atitti 载入类的几种方法 &#160;&#160;&#160;Class.forName&#160;ClassLoader.loadClass&#160;&#160;直接new
  2. A trip through the Graphics Pipeline 2011_02
  3. js动态设置窗体位置
  4. “尝试加载 Oracle 客户端库时引发 BadImageFormatException”的解决方案
  5. 构建一个最简单的web应用并部署及启动
  6. 流API--缩减操作
  7. 总结一下 Spring的IOC、DI
  8. python编程实战
  9. pandas基本操作2
  10. fedora23安装搜狗輸入法?
  11. Android学习之——切换应用主题实现日间和夜间效果的更换
  12. javaweb 实战_1
  13. Python正则表达式操作指南
  14. while 语句
  15. 快速初步了解Neo4j与使用
  16. Android Studio 2.3更换默认的ConstraintLayout布局
  17. MySQL5.6版本性能调优my.cnf详解
  18. 从wiresharp看tcp三次握手
  19. Android Freeline加速编译App方案 使用和总结
  20. 批处理文件 bat 的入门命令

热门文章

  1. kubernets之控制器之间的协作以及网络
  2. 相对论中的光速c不变,这么讲!你总能理解了吧!
  3. pytest:通过scope控制fixture的作用范围
  4. libuv工作队列
  5. VS2019中scanf返回值被忽略的问题及其解决方法
  6. MySQL的双主配置
  7. (ETL)ETL架构师面试题(转载)
  8. 使用eventfd创建一个用于事件通知的文件描述符
  9. 一个基于protocol buffer的RPC实现
  10. 小步前进之WCF简介