BZOJ4537 : [Hnoi2016]最小公倍数
将边按$a$从小到大排序,每$\sqrt{m}$个取一个关键点。
对于每个关键点,将这个点之前的边以及要在这个关键点回答的询问按$b$排序。
依次加入这个关键点之前的每条边,用并查集维护每个连通块$a$和$b$的最大值。
对于零碎部分,只有$\sqrt{m}$条边,暴力加入即可。
用一个栈按时间记录所有修改操作,然后撤销操作即可。
时间复杂度$O(m\sqrt{m}\log n)$。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=50010,M=100010;
int n,m,Q,lim,i,j,k,o,x,y,ans[N],cnt,a[M],b[N];
int f[N],d[N],va[N],vb[N],co;
struct P{int x,y,z;P(){}P(int _x,int _y,int _z){x=_x,y=_y;z=_z;}}op[N];
struct E{int x,y,a,b;}e[M],q[N];
inline bool cmpa(const E&a,const E&b){return a.a<b.a;}
inline bool cmpe(int x,int y){return e[x].b<e[y].b;}
inline bool cmpq(int x,int y){return q[x].b<q[y].b;}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int F(int x){return f[x]==x?x:F(f[x]);}
inline void merge(int x,int y,int a,int b,int type){
x=F(x),y=F(y);
if(x!=y){
if(d[x]==d[y]){
if(type)op[++co]=P(1,x,d[x]);
d[x]++;
}
if(d[x]<d[y])swap(x,y);
if(type)op[++co]=P(0,y,y);
f[y]=x;
if(va[x]<va[y]&&va[y]>a){
if(type)op[++co]=P(2,x,va[x]);
va[x]=va[y];
}
if(vb[x]<vb[y]&&vb[y]>b){
if(type)op[++co]=P(3,x,vb[x]);
vb[x]=vb[y];
}
}
if(va[x]<a){
if(type)op[++co]=P(2,x,va[x]);
va[x]=a;
}
if(vb[x]<b){
if(type)op[++co]=P(3,x,vb[x]);
vb[x]=b;
}
}
inline void retrace(){
for(int i=co;i;i--){
if(!op[i].x)f[op[i].y]=op[i].z;
else if(op[i].x==1)d[op[i].y]=op[i].z;
else if(op[i].x==2)va[op[i].y]=op[i].z;
else vb[op[i].y]=op[i].z;
}
co=0;
}
int main(){
read(n),read(m);
while(lim*lim<m)lim++;
for(i=1;i<=m;i++)read(e[i].x),read(e[i].y),read(e[i].a),read(e[i].b),a[i]=i;
sort(e+1,e+m+1,cmpa);
read(Q);
for(i=1;i<=Q;i++)read(q[i].x),read(q[i].y),read(q[i].a),read(q[i].b);
for(i=0;i<=m;i+=lim){
cnt=0;
for(j=1;j<=Q;j++)if(q[j].a>=e[i].a&&(i+lim>m||q[j].a<e[i+lim].a))b[++cnt]=j;
if(!cnt)continue;
sort(a+1,a+i+1,cmpe);
sort(b+1,b+cnt+1,cmpq);
for(j=1;j<=n;j++)f[j]=j,d[j]=0,va[j]=vb[j]=-1;
for(j=k=1;j<=cnt;j++){
while(k<=i&&e[a[k]].b<=q[b[j]].b){
merge(e[a[k]].x,e[a[k]].y,e[a[k]].a,e[a[k]].b,0);
k++;
}
co=0;
for(o=min(i+lim-1,m);o>i;o--)
if(e[o].a<=q[b[j]].a&&e[o].b<=q[b[j]].b)
merge(e[o].x,e[o].y,e[o].a,e[o].b,1);
x=F(q[b[j]].x),y=F(q[b[j]].y);
if(x==y&&va[x]==q[b[j]].a&&vb[x]==q[b[j]].b)ans[b[j]]=1;
retrace();
}
}
for(i=1;i<=Q;i++)puts(ans[i]?"Yes":"No");
return 0;
}
BZOJ4537 : [Hnoi2016]最小公倍数的更多相关文章
- [BZOJ4537][HNOI2016]最小公倍数(分块+并查集)
4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1687 Solved: 607[Submit][Stat ...
- [BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集
4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1474 Solved: 521[Submit][Stat ...
- BZOJ4537 HNOI2016最小公倍数(莫队+并查集)
考虑边只有一种权值的简化情况.那么当且仅当两点可以通过边权<=x的边连通,且连通块内最大边权为x时,两点间存在路径max为x的路径.可以发现两种权值是类似的,当且仅当两点可以通过边权1<= ...
- 【BZOJ4537】[Hnoi2016]最小公倍数 分块
[BZOJ4537][Hnoi2016]最小公倍数 Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值.所有权值都可以分解成2^a*3^b的形式.现在 ...
- BZOJ 4537: [Hnoi2016]最小公倍数 [偏序关系 分块]
4537: [Hnoi2016]最小公倍数 题意:一张边权无向图,多组询问u和v之间有没有一条a最大为a',b最大为b'的路径(不一定是简单路径) 首先想到暴力做法,题目要求就是判断u和v连通,并查集 ...
- 【LG3247】[HNOI2016]最小公倍数
[LG3247][HNOI2016]最小公倍数 题面 洛谷 题解 50pts 因为拼凑起来的部分分比较多,所以就放一起了. 以下设询问的\(a,b\)为\(A,B\), 复杂度\(O(nm)\)的:将 ...
- 【bzoj4537】 Hnoi2016—最小公倍数
http://www.lydsy.com/JudgeOnline/problem.php?id=4537 (题目链接) 题意 给出一个${n}$个点${m}$条边的无向图,每条边有两个权值${a,b} ...
- 【 bzoj4537】HNOI2016 最小公倍数
首先将边按a的值分组,每$\sqrt{m}$一组. 对于每一组,将符合一组a的询问选出来,将这些询问和这一块之前的边(a一定小于这些询问)按b排序,然后交替插入,询问,对于一个询问,在当前块也有可能有 ...
- 4537: [Hnoi2016]最小公倍数
Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值.所有权值都可以分解成2^a*3^b的形式.现在有q个询问,每次询问给定四个参数u.v.a和b,请你 ...
随机推荐
- [译] 用 Swift 创建自定义的键盘
本文翻译自 How to make a custom keyboard in iOS 8 using Swift 我将讲解一些关于键盘扩展的基本知识,然后使用iOS 8 提供的新应用扩展API来创建一 ...
- Hadoop CDH5 集群管理
Hadoop 是一个开源项目,所以很多公司在这个基础进行商业化,Cloudera 对 Hadoop做了相应的改变.Cloudera 公司的发行版,我们将该版本称为 CDH(Cloudera Distr ...
- DLog的使用
DLog本质上就是个宏替换.DLog具体代码如下: #ifdef DEBUG #define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt) ...
- -A 解决数据库表太多,预读表时间很长
Reading table information for completion of table and column names You can turn off this feature to ...
- CLR via C#(17)--接口
CLR不允许继承多个基类,但是可以继承多个接口.凡是能使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例. 接口是对一组方法签名进行了统一命名,但不提供任何实现,而具体类则必须为继承的全 ...
- MVC公开课 – 1.基础 (2013-3-15广州传智MVC公开课)
1.MVC设计模式 Model 是指 要处理的业务代码和数据操作代码 View 视图 主要是指的 跟用户打交道 并能够展示数据 Controller 看成是 Model和View的桥梁 优点: 1 ...
- SQLAlchemy增删改查基本操作,及SQL基本技能样码(join,group)
练了一天,基本的东东应该有感觉了. #coding=utf-8 from datetime import datetime from sqlalchemy import (MetaData, Tabl ...
- MVP社区巡讲照片集
今天MVP社区巡讲在北京利星行微软大厦连同SQL PASS社区合办了一次线下活动,这次互动汇集了在北京大多数的微软MVP,他们都是微软认可的有着各微软产品和技术特长的技术专家,无论是MVP社区巡讲还是 ...
- 项目管理10000 hours – 瞎扯谈系列
本系列会 zz 网上现有的文章,套句经典的话就是死磕自己,娱乐大众. 项目能否按时完成是项目管理的重要目标,将会面临的问题有团队的稳定性,冲突,会议以及压力. 团队中适度的人员流动是可以理解的,如何减 ...
- 【leetcode】Reverse Words in a String
今天第一次在leetcode上提交了一个题目,据说这个网站基本上都是名企面试笔试题,今天无意一进去就看到第一题居然就是昨天的腾讯实习生笔试题,赶紧注册了个账号做题. 题目描述: Given an in ...