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

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

 

考虑暴力做法,对于每一个询问,暴力加入满足询问的边,然后维护联通性和maxpmaxqmaxp,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全新资源素材站源码 功能齐备 界面干净整洁

源码介绍 简单安装说明&#xff1a; 1、整站程序上传后台 2、然后导入数据库文件到数据库&#xff0c; 3、修改conf里面的conf的数据库名字及密码 4、配置伪静态 规则&#xff1a; location ~* \.(htm)$ { rewrite "^(.*)/(.?).htm(.*?)$" $1/index.php?$2…

jBPM和Drools工作台中的用户和组管理

介绍 本文讨论了一项新功能&#xff0c;该功能允许使用集成在jBPM和Drools Workbenches中的直观友好的用户界面来管理应用程序的用户和组。 用户和组管理 在安装&#xff0c;设置和使用此功能之前&#xff0c;本文讨论了一些以前的概念&#xff0c;需要进一步理解才能进一步使…

java懒加载设计模式_java设计模式——单例模式

整理一下设计模式的个人理解。描述单例模式是java中比较常见的一种设计模式&#xff0c;顾名思义为一个类只能创建一个实例&#xff0c;多用于全局对象&#xff0c;如&#xff1a;配置的加载&#xff0c;spring bean加载各种配置(spring容器所有bean默认都是单例)单例的特点为构…

BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

题目链接&#xff1a;BZOJ 洛谷\(O(n^2)\)DP很好写&#xff0c;对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]d[j]1\) for(int j1; j<i; j)if(a[j]<minv[i]&&maxv[j]<a[i])//序列只会变换一次 dp[i]max{dp[j]1}; 转移要满足两个条件&#xff1a;\(a[j]…

java 快速构建ssm项目_SSM快速搭建

基本环境搭建1、 创建Maven工程2、 导入项目相关依赖的jar包springspringmvcmybatismysqljunitspring-testlombokdevtoolsxmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org…

jpa 查询 列表_终极JPA查询和技巧列表–第2部分

jpa 查询 列表这一部分是该系列文章的第一部分 。 JPA&#xff1a;NamedQuery&#xff0c;使用日期查询&#xff0c;有关getSingleResult方法的警告 为了避免重复查询代码&#xff0c;提高性能并简化维护查询&#xff0c;我们可以使用NamedQueries。 NamedQuery使用JPQL作为语…

IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新

IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新 IE针对Ajax请求结果的缓存/ IE浏览器同一个请求第二次是缓存 一.在AJAX请求的属性上直接设置cache function getSetServer (selectIDs) {$.ajax({url:/kl_eas/v1/monitor/servers? new Date().toTimeString…

亿联本科java_厦门亿联2018面试题

一、选择器public class EqTest {public static void main(String[] args) {EqTest e new EqTest();}public EqTest() {String s "Java";String s2 "java";//if (s.equalsIgnoreCase(s2)){System.out.println("相等");} else {System.out.pri…

如何将云持久存储添加到JBoss Cool Store

我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 带有JBoss Cool Store的App Dev Cloud 上个月&#xff0c;我们提供了一个完整的零售示例&#xff0c;其中的JBoss Cool Store运行在您的堆栈的OpenShift Enterprise层上&#xff0c;由…

吴莫烦

https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/2-1-NN/转载于:https://www.cnblogs.com/lhuser/p/8446525.html

mysql 表单属性_php表单常用属性有什么?

程序开发中&#xff0c;必不可少的会使用到form表单&#xff0c;以前只是在前端开发时简单使用&#xff0c;对它的属性不甚了解&#xff0c;最近在后端学习中&#xff0c;不断接触到它的属性,现记录一二。下面本篇文章给大家介绍php表单常用的5个属性。actionaction规定了提交表…

centos-安装python3.6环境并配置虚拟环境

python3.6下载地址&#xff1a;https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz linux下python环境配置 统一目录&#xff1a; 源码存放位置 $HOME/tools安装目录&#xff1a; /application安装python环境&#xff1a; 1. 下载 # 创建下载目录 mkdir $HOME/tools #…

java构造器详解_Java中关于构造器的使用详解

这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方&#xff0c;需要的朋友可以参考下Java构造器使用方法及注意事项超类的构造器在子类的构造器运行之前运行&#xff0c;也就是说&#xff0c;在创建对象时&#xff0c;先运…

i219 2012驱动_2012年I / O之后

i219 2012驱动从注册到赠品&#xff0c;每年的I / O疯狂都在不断发展。 在今年20分钟内被出售&#xff0c;并没有阻止Google赠送更多的东西。 以这种速度并有望在明年发布Google Glass&#xff0c;明年注册很可能会变得更加混乱&#xff01; 因此&#xff0c;Google&#xff0c…

Mac 工程化工具

工程化工具 一、HomeBerw 安装 / 卸载 Mac系统的包管理器&#xff0c;用于安装NodeJS和一些其他必需的工具软件 1.安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 译注&#xff1a;在Max OS X 10.11&…

java的sql的like_[Java教程]SQL like 模糊查询, in

[Java教程]SQL like 模糊查询, in0 2018-09-14 11:00:38​[{"互联网":["网络媒体","微博","墨迹天气","河北天气","其他"]},{"气象部门":["灾害大典","灾情普查","灾情直报&q…

9.管好进程和服务

1.查看进程 1.进程分类进程一般分为交互进程、批处理进程和守护进程三类。上述三种进程各有各的作用&#xff0c;使用场合也有所不同。 交互进程&#xff1a;由一个 shell 启动的进程。交互进程既可以在前台运行&#xff0c;也可以在后台运行。 批处理进程&#xff1a;这种…

惠而浦:使用Netty和Kafka的微服务

介绍 在上一个博客中 &#xff0c;我介绍了Netty用作Web服务器。 该示例运行良好……只要需要广播服务器即可。 大多数情况下不是很有用。 更有可能的是&#xff0c;每个客户端仅接收针对其的数据&#xff0c;并保留了特殊情况下的广播&#xff0c;例如“服务器在15分钟内停机…

石化总部java面试题_中国石化面试经验

面试过程&#xff1a;首先&#xff0c;上午进行面试人员签到&#xff0c;大约100人左右。一共要2个人。下午1点半开始统一面试。人员较多&#xff0c;所以每个人只有3分钟时间&#xff0c;一共最少8位面试官。过程中&#xff0c;他们很少提问题&#xff0c;如果你的技术比较新颖…

ajax标准

$.ajax({url:"localhost:8889/server", //请求的url地址dataType:"json", //返回格式为jsonasync:true,//请求是否异步&#xff0c;默认为异步&#xff0c;这也是ajax重要特性data:{"id":"value"}, //参数值type:"GET&qu…