2019牛客暑期多校训练营(第八场)E.Explorer
链接:https://ac.nowcoder.com/acm/contest/888/E
来源:牛客网
Please help them to find the number of valid sizes.
输入描述:
1≤n,m≤105,1≤u<v≤n,1≤l≤r≤1091 \le n,m \le 10^5, 1 \le u < v \le n, 1 \le l \le r \le 10^91≤n,m≤105,1≤u<v≤n,1≤l≤r≤109
输出描述:
Print a non-negative integer in a single line, denoting the number of valid sizes.
输入
5 5
1 2 1 4
2 3 1 2
3 5 2 4
2 4 1 3
4 5 3 4
输出
2 题意:
给定m条边,每条边有一个通过的阈值,问可以从1到n的值有多少个.
思路:
把这些边放入一个点表示区间的线段树里面.
这真是我从未见过的全新套路,在线段树上dfs,相当于枚举权值,由于每一个点代表区间,所以每次就枚举到了一个区间. 枚举之时用并查集判断.
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime> #define fuck(x) cerr<<#x<<" = "<<x<<endl;
#define debug(a, x) cerr<<#a<<"["<<x<<"] = "<<a[x]<<endl;
#define lson l,mid,ls
#define rson mid+1,r,rs
#define ls (rt<<1)
#define rs ((rt<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int loveisblue = ;
const int maxn = ;
const int maxm = ;
const int inf = 0x3f3f3f3f;
const ll Inf = ;
const int mod = ;
const double eps = 1e-;
const double pi = acos(-);
int n,m;
struct edge{
int u,v,l,r;
}e[maxn];
int f[maxn],rk[maxn];
int rem[maxn],tot; vector<int>eg[maxn<<]; void update(int l,int r,int rt,int L,int R,int id){
if(rt==){ return;}
if(L<=l&&R>=r){
eg[rt].push_back(id);
return;
}
int mid = (l+r)>>;
if(L<=mid)update(l,mid,rt*,L,R,id);
if(R>mid)update(mid+,r,rt*+,L,R,id);
} int getf(int x){
if(x==f[x]){ return x;}
return getf(f[x]);
} int ans = ;
struct node{
int num,type;
}; void dfs(int l,int r,int rt){ stack<node>tmp;
for(auto it:eg[rt]){
int t1 = getf(e[it].u);
int t2 = getf(e[it].v);
if(rk[t1]<rk[t2]){
tmp.push(node{f[t1],});
f[t1]=f[t2];
}else if(rk[t1]>rk[t2]){
tmp.push(node{f[t2],});
f[t2]=f[t1];
}else{
tmp.push(node{f[t2],});
f[t2]=f[t1];
rk[t2]++;
}
} if(l==r){
if(getf()==getf(n)&&l!=tot){
ans+=rem[r+]-rem[l];
}
while (!tmp.empty()){
node it = tmp.top();
tmp.pop();
f[it.num]=it.num;
if(it.type==){
rk[it.num]--;
}
}
return;
}
int mid = (l+r)>>;
dfs(lson);
dfs(rson);
while (!tmp.empty()){
node it = tmp.top();
tmp.pop();
f[it.num]=it.num;
if(it.type==){
rk[it.num]--;
}
}
} int get_id(int x){
return lower_bound(rem+,rem++tot,x)-rem;
} int main() { scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
f[i]=i;
rk[i]=;
} for(int i=;i<=m;i++){
scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].l,&e[i].r);
rem[++tot] = e[i].l;
rem[++tot] = e[i].r+;
}
sort(rem+,rem++tot);
tot = unique(rem+,rem++tot)-rem-; for(int i=;i<=m;i++){
cout<<get_id(e[i].l)<<" "<<get_id(e[i].r+)-<<endl;
update(,tot,,get_id(e[i].l),get_id(e[i].r+)-,i);
}
dfs(,tot,);
printf("%d\n",ans);
return ;
}
2019牛客暑期多校训练营(第八场)E.Explorer的更多相关文章
- 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)等价,等价的定义为其任意 ...
- 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)
题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...
随机推荐
- PHPCMS快速建站系列之类别调用及类别显示页面
在需要调用类别的地方,比如列表页,首先写循环前面写上一句: <?php $TYPE = getcache('type_content','commons');?> 这句就是把类别缓存加载进 ...
- element-ui select 二级联动
在使用select 选择框时,2个select 怎么关联在一起(第一个值发生变化,第二个select值随第一个变化而不同) 两个输入框代码 <el-form :inline="tru ...
- ural1297 后缀数组+RMQ
RMQ即求区间(i,j)的最值.通过O(nlogn)处理,O(1)给出答案. RMQ主要是动态规划来做.dp[i][j]表示从i开始的长为2^j的区间最值. 那么可以得到dp[i][j]=max(dp ...
- SpingMVC ModelAndView, Model,Control以及参数传递总结
1.web.xml 配置: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <servlet> <servlet-name>dispatcher& ...
- 重磅课程|《CNCF x Alibaba 云原生技术公开课》正式开讲!
到底什么是“云原生”?云原生与 CNCF.Kubernetes 是什么关系?作为云计算时代的开发者和从业者,我们该如何在“云原生”的技术浪潮中站稳脚跟,将云原生落地.实现个人的自我升级呢? 201 ...
- 在dva框架和create-react-app创建出来的框架中修饰器语法与按需加载引入antd分别配置
按需加载需要的包 babel-plugin-import 装饰器语法需要的包 @babel/plugin-proposal-decorators dva框架 将.webpackrc 改成. ...
- LeetCode93 Restore IP Addresses
题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...
- 基于TableStore的海量气象格点数据解决方案实战
前言 气象数据是一类典型的大数据,具有数据量大.时效性高.数据种类丰富等特点.气象数据中大量的数据是时空数据,记录了时间和空间范围内各个点的各个物理量的观测量或者模拟量,每天产生的数据量常在几十TB到 ...
- git 本地仓库操作
一.git对象模型和存储 二.常用命令 1)git checkout branch 切换分支 假设现在有两个分支,master和dev分支 i dev分支上没有readme.txt 在master分支 ...
- 2019-7-29-NetBIOS-计算机名称命名限制
title author date CreateTime categories NetBIOS 计算机名称命名限制 lindexi 2019-07-29 09:59:17 +0800 2018-12- ...