2019牛客暑期多校训练营(第八场) E 线段树+可撤销并查集
题意:
给出m条无向边,每条边都有一个$[l,r]$,意思是体积在这个范围内的人才能通过这条边,询问有多少种体积的可能性,能使人从1到n
思路:由于是无向边,1和n的连通性可以用并查集维护。
考虑最暴力的做法,枚举每一种体积,将当前体积能通过的边用并查集维护一下,判断1到n的连通性即可。
考虑优化,首先区间必定可以离散化,并且我们可以将离散化后的区间按照线段树的方式划分一下,然后将每一个子区间的边用并查集连一下,判断连通性,然后离开这个子区间时,将并查集的连边操作退回就可以了。
由于每条边最多被划分成log个区间,也就是会被并查集加入log次,拆开log次,所以时间复杂度是(n*logn*logn),其中一个log是并查集带来的,常数很小。
可撤销的并查集用按秩合并来完成,并且只能回退连续一段时间的操作,离散化后点有2*n个,线段树点不要开太少。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,b,a) for(int i=b;i>=a;i--)
#define pb(x) push_back(x)
#define pii pair<int,int >
using namespace std;
const int maxn=;
vector<int >tr[maxn<<];
int n,m;
struct edge{
int u,v,l,r;
}a[maxn];
int b[maxn<<],cnt,ans;
int fa[maxn],siz[maxn];
int find(int x){
return x==fa[x]?x:find(fa[x]);
}
void update(int o,int l,int r,int ql,int qr,int i){
if(ql<=l&&r<=qr){
tr[o].pb(i);
return;
}
int mid=(l+r)>>;
if(ql<=mid)update(o<<,l,mid,ql,qr,i);
if(mid<qr)update(o<<|,mid+,r,ql,qr,i);
}
void dfs(int o,int l,int r){
vector<pii >ve;
int si=tr[o].size();
rep(i,,si-){
int id=tr[o][i];
int u=a[id].u,v=a[id].v;
int fu=find(u),fv=find(v);
if(fu==fv)continue;
if(siz[fu]>siz[fv])swap(fu,fv);
fa[fu]=fv;
int d=;
if(siz[fu]==siz[fv])d++;
siz[fv]+=d;
ve.push_back({fu,d});
}
int mid=(l+r)>>;
if(find()==find(n)){
ans+=b[r+]-b[l];
}else if(l<r){
dfs(o<<,l,mid);
dfs(o<<|,mid+,r);
}
si=ve.size();
dep(i,si-,){
siz[fa[ve[i].first]]-=ve[i].second;
fa[ve[i].first]=ve[i].first;
}
}
int main(){
cin>>n>>m;
rep(i,,n){
fa[i]=i;
siz[i]=;
}
for(int i=;i<=m;i++){
scanf("%d%d%d%d",&a[i].u,&a[i].v,&a[i].l,&a[i].r);
b[++cnt]=a[i].l;
b[++cnt]=a[i].r+;
}
sort(b+,b++cnt);
cnt=unique(b+,b++cnt)-b-;
for(int i=;i<=m;i++){
a[i].l=lower_bound(b+,b++cnt,a[i].l)-b;
a[i].r=lower_bound(b+,b++cnt,a[i].r+)-b;
update(,,cnt,a[i].l,a[i].r-,i);
}
dfs(,,cnt);
printf("%d\n",ans);
}
2019牛客暑期多校训练营(第八场) E 线段树+可撤销并查集的更多相关文章
- 2019牛客暑期多校训练营(第九场)All men are brothers——并查集&&组合数
题意 最初有 $n$ 个人且互不认识,接下来 $m$ 行,每行有 $x,y$,表示 $x$ 和 $y$ 交朋友,朋友关系满足自反性和传递性,每次输出当前选取4个人且互不认识的方案数. 分析 并查集维护 ...
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第二场)J-Subarray(思维)
>传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...
- 2019牛客暑期多校训练营(第一场)-A (单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...
随机推荐
- Git 学习第四天
我们已经知道,通过命令 git remote add origin git@github.com/Your.name/file.git 可以连接远程仓库,那么,假如我现在想切换另个一远程仓库的连接应该 ...
- Android Telephony分析(六) ---- 接口扩展(实践篇)
本文将结合前面五篇文章所讲解的知识,综合起来,实现一个接口扩展的功能.如果还没有阅读过前面五篇文章的内容,请先阅读:<Android Telephony分析(一) — Phone详解 >& ...
- 高效IO之Java IO体系(一)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 个人觉得可以用“字节流操作类和字符流操作类组成了Java IO体系”来高度概括J ...
- Cyclical Quest CodeForces - 235C 后缀自动机
题意: 给出一个字符串,给出一些子串,问每个子串分别在母串中圆环匹配的次数, 圆环匹配的意思是将该子串拆成两段再首位交换相接的串和母串匹配,比 如aaab变成baaa,abaa,aaba再进行匹配. ...
- 众所周知,static修饰的成员只实例化一次,而string类型每次赋值都会重新创建一个实例,那么用static修饰string呢?
string 类型每次实例化都会重新创建一个实例: 解释:string 类型重载了运算符 “=” ,每次 “=” 操作都是一次 “new”. static 修饰符的成员只实例化一次?? 解释:这个说法 ...
- 2018-2-13-win10-uwp-让焦点在点击在页面空白处时回到textbox中
title author date CreateTime categories win10 uwp 让焦点在点击在页面空白处时回到textbox中 lindexi 2018-2-13 17:23:3 ...
- linux 磁盘与文件系统管理 (鸟哥私房菜)
各种接口磁盘在Linux中的文件名分别为 /dev/sd[a-p][1-15]:为SCSI,SATA,USB,Flash随身碟等接口的磁盘文件名 /dev/hd[a-d][1-63]:为IDE接口的磁 ...
- fork执行一个进程
https://coolr321.github.io/2018/10/30/%E4%B8%80%E4%B8%AAfork-%E8%B0%83%E7%94%A8%E7%9A%84%E4%BE%8B%E5 ...
- Java SE(2)
1.this的两种用法:(1)当成员变量和局部变量重名是,可以用关键字this来区分 .this代表对象,代表的是this所在函数所属对象的引用(哪个对象调用了this所在的函数,this就代表哪个对 ...
- Linux系统的buff/cache缓存清理脚本
cacheClean.sh #!/bin/bash # 日期: # 作者: 黄慧丰/何鹏举 # 说明: fastdfs所在的linux系统的buffer cache过大, 且并没有有效的自动回收, 因 ...