正题

题目链接:https://www.luogu.com.cn/problem/P3247


题目大意

nnn个点mmm条边,每条边有(x,y,a,b)(x,y,a,b)(x,y,a,b)。qqq次询问(x′,y′,a′,b′)(x',y',a',b')(x′,y′,a′,b′)表示询问是否存在一条x′−>y′x'->y'x′−>y′的路径使得路径上amax=a′,bmax=b′a_{max}=a',b_{max}=b'amax​=a′,bmax​=b′


解题思路

考虑暴力的做法,我们用加入所有a≤a′a\leq a'a≤a′且b≤b′b\leq b'b≤b′的边加入,然后看x′y′x'y'x′y′是否在同一连通块且联通块中a,ba,ba,b最大值是否是a′,b′a',b'a′,b′。

如何优化,我们把所有的边根据aia_iai​的权值分成若干个块,对于每个块我们把所有a′a'a′在这个范围的内的询问进行处理,我们把所有处理的询问和在块前面的边按照bbb排序,然后这一部分我们就用指针扫描加入,对于在块里的边我们就暴力扫描加入。

但是每个询问做完之后注意块里的边要删去,所以我们不能用路径压缩,用按秩合并即可。

时间复杂度O(qmlog⁡n)O(q\sqrt m\log n)O(qm​logn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cmath>
using namespace std;
const int N=1e5+10;
struct node{int x,y,a,b,s;
}e[N],q[N],cl[N];
int n,m,Q,tot,p[N];
int fa[N],siz[N],A[N],B[N];
bool ans[N];
bool cmpa(node x,node y)
{return x.a==y.a?(x.b<y.b):(x.a<y.a);}
bool cmpb(node x,node y)
{return x.b==y.b?(x.a<y.a):(x.b<y.b);}
int find(int x)
{return fa[x]==x?x:find(fa[x]);}
int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}
void unionn(int x,int y,int a,int b){x=find(x),y=find(y);if(siz[x]>siz[y])swap(x,y);cl[++tot]=(node){x,y,A[y],B[y],siz[y]};A[y]=max(max(A[x],A[y]),a);B[y]=max(max(B[x],B[y]),b);if(x!=y)fa[x]=y;siz[y]=max(siz[y],siz[x]+1);return;
}
void Clear(){for(int i=tot;i>=1;i--){fa[cl[i].x]=cl[i].x;A[cl[i].y]=cl[i].a;B[cl[i].y]=cl[i].b;siz[cl[i].y]=cl[i].s;}tot=0;return;
}
int main()
{//  freopen("multiple5.in","r",stdin);
//  freopen("data.out","w",stdout);n=read();m=read();for(int i=1;i<=m;i++)e[i].x=read(),e[i].y=read(),e[i].a=read(),e[i].b=read();Q=read();for(int i=1;i<=Q;i++)q[i].x=read(),q[i].y=read(),q[i].a=read(),q[i].b=read(),q[i].s=i;sort(e+1,e+1+m,cmpa);sort(q+1,q+1+Q,cmpb); int T=sqrt(m*log2(n));e[m+1].a=1e9+1;for(int k=1;k<=m;k+=T){int l=k,r=min(k+T,m);int cnt=0;for(int i=1;i<=n;i++)fa[i]=i,A[i]=B[i]=-1,siz[i]=0;for(int i=1;i<=Q;i++)if(q[i].a>=e[l].a&&q[i].a<e[r+1].a)p[++cnt]=i;if(!cnt)continue;if(k)sort(e+1,e+l,cmpb);int pt=1;for(int i=1;i<=cnt;i++){int x=p[i];while(pt<l&&e[pt].b<=q[x].b)unionn(e[pt].x,e[pt].y,e[pt].a,e[pt].b),pt++;tot=0;for(int j=l;j<=r;j++)if(e[j].a<=q[x].a&&e[j].b<=q[x].b)unionn(e[j].x,e[j].y,e[j].a,e[j].b);int fx=find(q[x].x),fy=find(q[x].y);ans[q[x].s]=((fx==fy)&&(A[fx]==q[x].a)&&(B[fx]==q[x].b));Clear();}}for(int i=1;i<=Q;i++)if(ans[i])printf("Yes\n");else printf("No\n");return 0;
}

P3247-[HNOI2016]最小公倍数【分块,并查集】相关推荐

  1. 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]

    洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...

  2. [BZOJ4537][Hnoi2016]最小公倍数(并查集+分块)

    Description 给定一张 NNN 个顶点 M" role="presentation" style="position: relative;" ...

  3. CF896E Welcome home, Chtholly(分块/并查集/第二分块)

    CF896E Welcome home, Chtholly 对于给定一个长度为n(n<=1e5)的序列,值域范围为1e5,要求支持两类操作. 将区间[l,r]内所有大于x的数减x 查询区间[l, ...

  4. [BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集

    4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec  Memory Limit: 512 MB Submit: 1474  Solved: 521 [Submit][St ...

  5. CF896E Welcome home,Chtholly/[Ynoi2018]五彩斑斓的世界(并查集+第二分块)

    CF896E Welcome home,Chtholly/[Ynoi2018]五彩斑斓的世界 description solution code description 五彩斑斓的世界 CF896E ...

  6. [HNOI2016]最小公倍数

    题面 \(\text{Solution:}\) 显然在线算法根本不可做,先将询问离线,按 \(b\) 排序. 注意到不一定是简单路径,所以一个询问回答为 \(Yes\) 当且仅当 \(u,v\) 在同 ...

  7. HDU - 2874 Connections between cities(并查集+LCA)

    题目链接:点击查看 题目大意:给出n个点代表城市,再给出m条边将其连接,每条边都有边权,题目保证给出的图无环,现在给出两个点,首先询问两个点是否互相连通,若可以连通,询问两点之间的距离 题目分析:判断 ...

  8. 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  9. 并查集(Union-Find)

    并查集(Union-Find) 并查集(Union-Find) 1.初始化 2.查询 3.合并 4.平衡性优化,扁平化 5.按秩合并 6.路径压缩 7.代码 常用模板 [★ 547. 省份数量](ht ...

最新文章

  1. jenkins+docker的简单项目部署
  2. SQL Server-聚焦事务、隔离级别详解(二十九)
  3. 在ubuntu10.04上安装永中office2010
  4. php与mysql同步_php实现mysql同步的实现方法
  5. vue-devtools 的安装
  6. [leetcode] 105.从前序与中序遍历构造二叉树
  7. 【面试题 - 最大值减去最小值小于或等于 num 的子数组数量】滑动窗口
  8. 正则表达式 学习笔记3.4
  9. RPC实现以及相关学习
  10. 堆排序算法讲解视频java版_堆排序算法的讲解及Java版实现
  11. [导入]MsAjax Lib- Date.parseInvariant 函数
  12. 兄弟j220怎么清零_兄弟打印机MFC_J220墨水回收盒满如何清零?
  13. 容斥原理模板(二进制表示)
  14. 【优化算法】Tent混沌映射的粒子群算法【含Matlab源码 940期】
  15. ug10万能许可证一键安装_优胜UG4.0-UG12.0-许可证一键自动安装下载|
  16. web基础_$POST 在线http接口测试网址
  17. 2022道路运输企业安全生产管理人员考试题及答案
  18. 【scrapy】scrapy按分类爬取豆瓣电影基础信息
  19. 视频教程-办公自动化,不求人!-Office/WPS
  20. 2019软件工程专业大学排名附官网-奥怪的小栈

热门文章

  1. python第k序列元素查找_Python寻找第k小的元素
  2. sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息
  3. linux 创建ll,两台linux建立GRE隧道
  4. SimpleXMLRPC_python xmlrpclib SimpleXMLRPCServer 模块
  5. 在python中strip_python中strip()函数怎么用?
  6. 计算机二级ppt为客户制作演示文稿,计算机二级ppt真题:制作介绍北京ppt
  7. c语言用递归法判断回文字符串,递归方式判断一个字符串是否为回文字符串
  8. 网站底部运行时间的php代码,网站底部运行时间统计代码
  9. excel筛选排序从小到大_excel表格怎么按字数的多少来排列!
  10. Java 重写 多态性_java多态性重写overriding和重载overloading的区别