Description

悠悠岁月,不知不觉,距那传说中的pppfish晋级泡泡帝已是过 去数十年。数十年 中,这颗泡泡树上,也是再度变得精彩,各种泡泡 天才辈出,惊艳世人,然而,似乎 不论后人如何的出彩,在他们的头 顶之上,依然是有着一道身影而立。 泡泡帝,pppfish。 现在,pppfish即将带着被自己收服的无数个泡泡怪前往下一个 空间,而在前往下 一个空间的道路上,有N个中转站,和M条空间虫洞连接中转站(双向通道,可有重 边,可有环),然而,通过虫洞 是要一定的条件的,pppfish将手下所有泡泡怪编号为 1,2 … +∞,对于每个空间虫洞,有两个值L和R,表示此虫洞只允许编号从L到 R的泡 泡怪通过,pppfish现在在1号中转站,他想带尽可能多的泡 泡怪到达N号中转站,于是 pppfish找到了机智的你,希望你告诉 他最多可以带多少个泡泡怪,同时他还想知道所 有泡泡怪的编号(若 有多组解取字典序最小的一组 )

Input

第一行两个用空格隔开的整数N,M(2<=N<=1000,0<=M<=3000) 接下来M行,每行四个用空格隔开的整数a,b,l,r 表示在a,b中转站间有一个空间虫洞允许编号l~r的泡泡怪通过。(1<=a, b<=N,1<=l<=r<=1e6

Output

第一行一个整数ans,表示最多能携带的泡泡怪数量 接下来一行ans个用空格隔开的正整数,表示泡泡怪的编号,从小到大依次输出,如 果没有泡泡怪能通过只要输出“0”就可以了

Sample Input

Input1:

4 4
1 2 1 10
2 4 3 5
1 3 1 5
2 4 2 7

Input2:

2 2
1 2 1 3
1 2 4 6

Sample Output

Output1:

6
2 3 4 5 6 7

Output2:

3
1 2 3

Data Constraint

30%的数据 1 <= N,M <= 10
100%的数据 2 <= N <= 1000, 0 <= M <= 3000, 1 <= a, b <= N, 1 <= l <= r <= 10^6

Solution

  • 本题最少有三种方法:最短路、LCT、并查集,我打了前两种。

  • 比赛的时候脑抽,居然不会做,比赛完十分钟切。。

  • 现将用最短路的方法,复杂度有点劣。

  • 我们发现显然答案区间肯定是边权中出现过的数字。

  • 那么我们枚举答案左区间端点,只用符合条件的边,

  • 再从1号点跑最短路,这里边权用右区间端点即可。

  • 我用的是SPFA,时间复杂度为 O(N∗M∗K)O(N∗M∗K)O(N*M*K) 。

Code_1

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=1005;
int n,m,tot,ans,num;
int first[N],nex[N*6],en[N*6],wl[N*6],wr[N*6];
int a[N*3],q[N*N],dis[N];
bool bz[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline int max(int x,int y)
{return x>y?x:y;
}
inline void insert(int x,int y,int l,int r)
{nex[++tot]=first[x];first[x]=tot;en[tot]=y;wl[tot]=l;wr[tot]=r;
}
int main()
{freopen("travel.in","r",stdin);freopen("travel.out","w",stdout);n=read(),m=read();int mn=1e6,mx=0;for(int i=1;i<=m;i++){int x=read(),y=read(),l=read(),r=read();a[i]=l;insert(x,y,l,r);insert(y,x,l,r);}sort(a+1,a+1+m);tot=unique(a+1,a+1+m)-(a+1);for(int i=1;i<=tot;i++){memset(dis,0,sizeof(dis));dis[q[1]=1]=1e6;int l=0,r=1;while(l<r){int x=q[++l];bz[x]=false;for(int j=first[x];j;j=nex[j])if(wl[j]<=a[i] && min(dis[x],wr[j])>dis[en[j]]){dis[en[j]]=min(dis[x],wr[j]);if(!bz[en[j]]) bz[q[++r]=en[j]]=true;}}if(dis[n]-a[i]+1>ans) ans=dis[n]-a[i]+1,num=a[i];}printf("%d\n",ans);for(int i=num;i<num+ans;i++) printf("%d ",i);return 0;
}
  • 然而有更快的方法,那就是LCT,O(N log N)O(NlogN)O(N\ log\ N) 就可以了。

  • 考虑维护最小生成树,将边按右区间端点从大到小加入,

  • LCT经典维护,边权为左区间端点。

  • 某一时刻若1和n连通,则看看此时能否更新答案即可。

Code2

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=1005;
struct data
{int x,y,l,r;
}a[N*3];
int top,ans,beg;
int fa[N<<2],s[N<<2][2],mx[N<<2],num[N<<2],st[N<<2];
bool rev[N<<2];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline bool cmp(data x,data y)
{return x.r>y.r;
}
inline bool pd(int x)
{return x==s[fa[x]][1];
}
inline bool isroot(int x)
{return x^s[fa[x]][0] && x^s[fa[x]][1];
}
inline void modify(int x)
{if(x) swap(s[x][0],s[x][1]),rev[x]^=1;
}
inline void down(int x)
{if(rev[x]){modify(s[x][0]),modify(s[x][1]);rev[x]=false;}
}
inline void update(int x)
{num[x]=mx[num[s[x][0]]]>mx[num[s[x][1]]]?num[s[x][0]]:num[s[x][1]];if(mx[x]>mx[num[x]]) num[x]=x;
}
inline void rotate(int x)
{int y=fa[x],w=pd(x);if(s[y][w]=s[x][w^1]) fa[s[y][w]]=y;if((fa[x]=fa[y]) && !isroot(y)) s[fa[y]][pd(y)]=x;s[fa[y]=x][w^1]=y;update(y);
}
inline void splay(int x)
{for(int y=st[top=1]=x;!isroot(y);y=fa[y]) st[++top]=fa[y];while(top) down(st[top--]);for(int y;!isroot(x);rotate(x))if(!isroot(y=fa[x])) rotate(pd(x)==pd(y)?y:x);update(x);
}
inline void access(int x)
{for(int y=0;x;x=fa[y=x]) splay(x),s[x][1]=y,update(x);
}
inline void mkroot(int x)
{access(x),splay(x),modify(x);
}
inline void link(int x,int y)
{mkroot(x),fa[x]=y;
}
inline void cut(int x,int y)
{mkroot(x),access(y),splay(y);s[y][0]=fa[x]=0;
}
inline int get(int x)
{access(x),splay(x);int y=x;while(s[y][0]) y=s[y][0];return y;
}
int main()
{freopen("travel.in","r",stdin);freopen("travel.out","w",stdout);int n=read(),m=read();for(int i=1;i<=m;i++) a[i].x=read(),a[i].y=read(),a[i].l=read(),a[i].r=read();sort(a+1,a+1+m,cmp);for(int i=1;i<=m;i++){int x=a[i].x,y=a[i].y,z=i+n;mx[num[z]=z]=a[i].l;if(get(x)^get(y)){link(x,z),link(z,y);}else{mkroot(x),access(y),splay(y);if(a[i].l<mx[num[y]]){int pos=num[y];cut(a[pos-n].x,pos),cut(pos,a[pos-n].y);link(x,z),link(z,y);}}if(get(1)==get(n)){mkroot(1),access(n),splay(n);if(a[i].r-mx[num[n]]+1>=ans) ans=a[i].r-mx[num[n]]+1,beg=mx[num[n]];}}write(ans),putchar('\n');for(int i=beg;i<beg+ans;i++) write(i),putchar(' ');return 0;
}

JZOJ 5794. 2018.08.10【2018提高组】模拟A组省选 旅行相关推荐

  1. 【一周头条盘点】中国软件网(2018.12.10~2018.12.14)

    每一个企业级应用的人都置顶了中国软件网 中国软件网为你带来最新鲜的行业干货 一周热点 青云QingCloud容器管理平台KubeSphere开启公测 近日,企业级全栈云ICT服务商青云QingClou ...

  2. JZOJ 6297. 2019.08.10【NOIP提高组A】世界第一的猛汉王

    DescriptionDescriptionDescription 给定nnn个红点和mmm个白点,当异色点曼哈顿距离不大于DDD存在压制关系,相同颜色的点存在关系但是由你决定,求最少和最多三个点满足 ...

  3. JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

    题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...

  4. 2018.08.10 atcoder Median Sum(01背包)

    传送门 题意简述:输入一个数组anan. 对于所有2n−12n−1个非空子集,每个子集的权值是包含的所有元素之和. 求这2n−12n−1个非空子集权值的中位数. 对于每个权值vv都有一个对应的&quo ...

  5. JZOJ 5281. 【NOIP提高组模拟A组8.15】钦点

    Description Input Output Sample Input 4 4 2 a a b b a a b b c c d d c c d d 1 1 3 3 2 2 3 1 1 3 2 2 ...

  6. 【JZOJ4790】【NOIP2016提高A组模拟9.21】选数问题

    题目描述 在麦克雷的面前有N个数,以及一个R*C的矩阵.现在他的任务是从N个数中取出R*C个,并填入这个矩阵中.矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值.现在, ...

  7. 【二分,找规律】Day 14 提高组模拟C组 T1 小麦亩产一千八

    题目大意 给定斐波那契的第aaa项,求出第b" role="presentation">bbb项,默认第0项为1 解题思路 方法一:递推 找到规律后O(b)O(b) ...

  8. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  9. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

最新文章

  1. SylixOS ARP攻击解决办法
  2. SSMSSH项目中 springmvc 乱码问题解决
  3. .Net Core中使用RabbitMQ
  4. php+数学计算公式,PHP数学计算函数总结
  5. MFC命令行及CCommandLineInfo类
  6. 第一次离线写Blog,先上个图先
  7. 操作系统:第二章 进程管理2 - 处理机调度
  8. python库快速安装_python的pip快速安装代码
  9. LeetCode 791. 自定义字符串排序(map)
  10. vue保存图片到手机相册_手机照片误删了怎么找回?这三个方法轻松搞定,亲测有效...
  11. Docker快速安装RabbitMQ服务
  12. 京东企业租赁11.11:新用户数环比增长786% 订单量环比增长519%
  13. 《转载》python爬虫实践之模拟登录
  14. matlab乘与点乘的区别 (*与.* ^与.^)
  15. pyecharts基础图表汇总(三国演义可视化)
  16. 为什么python打不开_Python打不开.py文件
  17. 启蒙||那些人,那些剧||爱情+文学+英语
  18. explain mysql_mysql explain详解
  19. Widget Extention开发笔记
  20. Qt Creator使用ninja 编译

热门文章

  1. Go 语言 cannot find module providing package github.com/
  2. 手把手实现YOLOv3(二)
  3. AlexNet代码解读
  4. latex二元关系符号
  5. 科大星云诗社动态20210305
  6. LeetCode 795. 区间子数组个数
  7. 空间三维散点数据的线性拟合
  8. A review of 3D/2D registration methods for image-guided interventions(1)
  9. C 函数传递指针参数注意事项
  10. 汇编题20200330