[jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)
2024-08-31 12:51:07
题目链接:
https://jzoj.net/senior/#main/show/5177
题目:
题解:
首先选出的泡泡怪一定是连续的一段 L,R
然后 L 一定属于虫洞左边界中的某一个 R 也同样是这样的
这样就可以枚举 L 和 R,$O(N)$判断是否可行(显然不可能重复经过某个点),总复杂度 $O(NM^2)$
我们看到 R<=1e6 选择二分 R 而不是枚举,这样就可以了
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std; const int N=1e3+;
const int M=3e3+;
const int inf=1e6;
int n,m,tot;
int head[N],L[M],vis[N];
struct EDGE{
int to,nxt,l,r;
}edge[M<<];
inline int read(){
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void link(int u,int v,int l,int r){
edge[++tot]=(EDGE){v,head[u],l,r};
head[u]=tot;
}
bool dfs(int x,int l,int r)
{
if (x==n) return ;
if (vis[x]) return ;
vis[x]=;
for (int i=head[x];i;i=edge[i].nxt)
{
if (edge[i].l<=l&&edge[i].r>=r)
{
if (dfs(edge[i].to,l,r)) return ;
}
}
return ;
}
bool check(int l,int r)
{
memset(vis,,sizeof(vis));
if (dfs(,l,r)) return ;
return ;
}
int main()
{
n=read();m=read();
for (int i=,u,v,l,r;i<=m;i++){
u=read();v=read();l=read();r=read();
link(u,v,l,r);link(v,u,l,r);
L[i]=l;
}
sort(L+,L++m);
int ans=,al,ar;
for (int i=m;i;i--){
int l=L[i],r=inf;
while (l+<r)
{
int mid=l+r>>;
if (check(L[i],mid))
{
if (mid-L[i]+>=ans)
{
ans=mid-L[i]+;
al=L[i];ar=mid;
}
l=mid;
}
else r=mid;
}
}
printf("%d\n",ans);
for (int i=al;i<=ar;i++) printf("%d ",i);
return ;
}
最新文章
- App-Pass the password
- CUtilityCode
- Eclipse JAVA项目的 目录结构 和 导入
- win8自动升级win8.1后 wampserver无法启动
- 【WP8.1】富文本
- 【HDU 1828】 Picture (矩阵周长并,线段树,扫描法)
- SICP的一些个人看法
- 【POJ3612】【USACO 2007 Nov Gold】 1.Telephone Wire 动态调节
- Go语言极速入门手册
- Mahout系列之----kmeans 聚类
- Python生成器的原理及使用
- Linux:Day4(上) 文件管理、管道
- TensorFlow从入门到理解(一):搭建开发环境【基于Ubuntu18.04】
- Linux下源码安装xz的方法
- oslo_messaging与rabbitmq
- Biorhythms HDU - 1370 (中国剩余定理)
- 利用gulp搭建less编译环境
- opencv2函数学习之flip:实现图像翻转
- C/C++之Memcpy and memmove
- javascript的简单查询和插入和修改