4537: [Hnoi2016]最小公倍数

Time Limit: 40 Sec  Memory Limit: 512 MB
Submit: 1474  Solved: 521
[Submit][Status][Discuss]

Description

  给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值。所有权值都可以分解成2^a*3^b
的形式。现在有q个询问,每次询问给定四个参数u、v、a和b,请你求出是否存在一条顶点u到v之间的路径,使得
路径依次经过的边上的权值的最小公倍数为2^a*3^b。注意:路径可以不是简单路径。下面是一些可能有用的定义
:最小公倍数:K个数a1,a2,…,ak的最小公倍数是能被每个ai整除的最小正整数。路径:路径P:P1,P2,…,Pk是顶
点序列,满足对于任意1<=i<k,节点Pi和Pi+1之间都有边相连。简单路径:如果路径P:P1,P2,…,Pk中,对于任意1
<=s≠t<=k都有Ps≠Pt,那么称路径为简单路径。

Input

  输入文件的第一行包含两个整数N和M,分别代表图的顶点数和边数。接下来M行,每行包含四个整数u、v、a、
b代表一条顶点u和v之间、权值为2^a*3^b的边。接下来一行包含一个整数q,代表询问数。接下来q行,每行包含四
个整数u、v、a和b,代表一次询问。询问内容请参见问题描述。1<=n,q<=50000、1<=m<=100000、0<=a,b<=10^9

Output

  对于每次询问,如果存在满足条件的路径,则输出一行Yes,否则输出一行 No(注意:第一个字母大写,其余
字母小写) 。

Sample Input

4 5
1 2 1 3
1 3 1 2
1 4 2 1
2 4 3 2
3 4 2 2
5
1 4 3 3
4 2 2 3
1 3 2 2
2 3 2 2
1 3 4 4

Sample Output

Yes
Yes
Yes
No
No

HINT

Source

考虑暴力做法,对于每一个询问,暴力加入满足询问的边,然后维护联通性和maxp,maxqmaxp,maxq,如果满足条件则YesYes。 
两个条件的限制似乎很难用别的数据结构优化掉,那么考虑分块,先以pp为第一关键字,qq为第二关键字排序,每$m^{0.5}$分成一块。然后把每一个询问归类到相应的块中,使得这个询问的$p$大于等于块的$p$最小值小于等于最大值。 
依次扫每个块,把每个块的询问取出来。设当前的块号是$i$,那么我们把$1$到$i-1$的块里面的所有的边按$b$排序,

再把这个块内的询问按$q$排序。然后扫$1$到$i-1$的符合当前询问的边,加入并查集。对于i块内的边,只能暴力扫然后加入并查集了,注意处理完这个询问后,要撤销掉在该块内加入的边。

所以此题的并查集不能路径压缩,要用启发式合并或按秩合并,两者都是$logn$的,总的时间复杂度时$O(n^{1.5}logn)$。

将代码中的启发式换成按秩合并可AC否则TLE

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<algorithm>
 7 #define ll long long
 8 #define maxn 140105
 9 using namespace std;
10 int read() {
11     int x=0,f=1;char ch=getchar();
12     for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
13     for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
14     return x*f;
15 }
16 int n,m,k;
17 struct data {
18     int a,b,p,q,id,f;
19     bool operator <(const data tmp) const{
20         return p==tmp.p?q<tmp.q:p<tmp.p;
21     }
22 }e[maxn],ask[maxn],tmp[maxn],sta[maxn];
23 int fa[maxn],sz,ma[maxn],mb[maxn],size[maxn];
24 int ans[maxn];
25 int find(int x) {return fa[x]==x?fa[x]:find(fa[x]);}
26 int cnt=0;
27 void merge(int x,int y,int a,int b) {
28     x=find(x),y=find(y);
29     if(size[x]>size[y]) swap(x,y);
30     sta[++cnt].a=x;sta[cnt].b=y;sta[cnt].p=ma[y];sta[cnt].q=mb[y];sta[cnt].f=fa[x];sta[cnt].id=size[y];
31     if(x==y) {
32         ma[x]=max(ma[x],a);
33         mb[x]=max(mb[x],b);
34     }
35     else {
36         fa[x]=y;
37         size[y]+=size[x];
38         ma[y]=max(ma[y],a);
39         mb[y]=max(mb[y],b);
40         ma[y]=max(ma[x],ma[y]);
41         mb[y]=max(mb[x],mb[y]);
42     }
43 }
44 bool cmp(data a,data b) {return a.q==b.q?a.p<b.p:a.q<b.q;}
45 int main() {
46
47     n=read(),m=read();
48     for(int i=1;i<=m;i++) {
49         e[i].a=read();e[i].b=read();e[i].p=read();e[i].q=read();
50     }
51     sort(e+1,e+m+1);
52     sz=sqrt(m);
53     k=read();
54     for(int i=1;i<=k;i++) {
55         ask[i].a=read(),ask[i].b=read(),ask[i].p=read(),ask[i].q=read();ask[i].id=i;
56     }
57     sort(ask+1,ask+k+1,cmp);
58     for(int i=1;i<=m;i+=sz) {
59         int top=0;
60         for(int j=1;j<=k;j++) if(ask[j].p>=e[i].p&&(i+sz>m||ask[j].p<e[i+sz].p)) tmp[++top]=ask[j];
61         sort(e+1,e+i,cmp);
62         for(int j=1;j<=n;j++) fa[j]=j,size[j]=1,ma[j]=mb[j]=-2147483647;
63         int w=1;
64         for(int j=1;j<=top;j++) {
65             for(;w<i;w++) {
66                 if(e[w].q>tmp[j].q) break;
67                 merge(e[w].a,e[w].b,e[w].p,e[w].q);
68             }
69             cnt=0;
70             for(int t=i;t<i+sz;t++) {
71                 if(e[t].p<=tmp[j].p&&e[t].q<=tmp[j].q) merge(e[t].a,e[t].b,e[t].p,e[t].q);
72             }
73             int t1=find(tmp[j].a),t2=find(tmp[j].b);
74             if(t1==t2&&ma[t1]==tmp[j].p&&mb[t1]==tmp[j].q) ans[tmp[j].id]=1;
75             while(cnt) {
76                 fa[sta[cnt].a]=sta[cnt].f;
77                 ma[sta[cnt].b]=sta[cnt].p;
78                 mb[sta[cnt].b]=sta[cnt].q;
79                 size[sta[cnt].b]=sta[cnt].id;
80                 cnt--;
81             }
82         }
83     }
84     for(int i=1;i<=k;i++) if(ans[i]) puts("Yes");else puts("No");
85
86 }

View Code

转载于:https://www.cnblogs.com/wls001/p/8435071.html

[BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集相关推荐

  1. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  2. 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解

    题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...

  3. 洛谷P7518:宝石(倍增、可撤销并查集)

    解析 算法一 定义 upx,kup_{x,k}upx,k​ 为节点 xxx 从自己的颜色所在位置在返祖链上往后跳 2k2^k2k 个颜色到达的节点. 可以像倍增一样的求解. 这样对于一次询问 (s,t ...

  4. CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点,没有边. 依次加入mmm条带权的边,每次加入后询问是否存在一个边集,满足每 ...

  5. BZOJ4358: permu(带撤销并查集 不删除莫队)

    题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...

  6. codeforces 892E(离散化+可撤销并查集)

    题意 给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问 每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中 分析 要知道一个性质,就是权值不同 ...

  7. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  8. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

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

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

最新文章

  1. card样式 layui_layui样式修改
  2. Kafka生产者发送消息的三种方式
  3. Kubernetes从懵圈到熟练:认证与调度
  4. jupyter notebook
  5. 读他:男人最怕听的十句话
  6. RAID简介[zz]
  7. 一个前端的10年前端职业路
  8. 魔百盒哪款型号配置高_砂石厂都在用哪种洗砂设备,哪款洗沙机效率更高?
  9. 学习戴铭博文《从 ReactiveCocoa 中能学到什么?不用此库也能学以致用》的总结...
  10. 数字证书(Certificate)
  11. 一起谈.NET技术,ASP.NET Routing对请求的处理方式
  12. java中struts2框架,概述Java的struts2框架
  13. 算法设计与分析学习总结
  14. EasyRecovery14永久免费版密钥电脑硬盘恢复教程
  15. 风控建模基础笔记(一)
  16. win10和win8双系统安装
  17. Android实现九宫格图片控件
  18. 地球子午圈和卯酉圈曲率半径计算公式
  19. 正则表达式匹配 整数和正整数
  20. 让WINDOWS XP自动登陆

热门文章

  1. layui按钮展开、_layui可折叠的组织架构树形图
  2. 剑指 Offer 01-----20
  3. mysql+after+commit_Spring事务aftercommit原理及实践
  4. android照片备份软件下载,照片备份云相册app下载-照片备份云相册下载V1.9安卓版-西西软件下载...
  5. 前端页面预览word_jquery.media.js实现前端页面预览
  6. 解决Windows 10 CPU占用高风扇吵问题
  7. 【渝粤教育】 国家开放大学2020年春季 1259西方行政学说 参考试题
  8. 【渝粤题库】陕西师范大学209041 金融工程学 作业(专升本)
  9. 【渝粤教育】电大中专职业生涯规划 (3)作业 题库
  10. 【渝粤教育】广东开放大学 社会工作综合能力 形成性考核 (27)