将边按$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]最小公倍数的更多相关文章

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

    4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1687  Solved: 607[Submit][Stat ...

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

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

  3. BZOJ4537 HNOI2016最小公倍数(莫队+并查集)

    考虑边只有一种权值的简化情况.那么当且仅当两点可以通过边权<=x的边连通,且连通块内最大边权为x时,两点间存在路径max为x的路径.可以发现两种权值是类似的,当且仅当两点可以通过边权1<= ...

  4. 【BZOJ4537】[Hnoi2016]最小公倍数 分块

    [BZOJ4537][Hnoi2016]最小公倍数 Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值.所有权值都可以分解成2^a*3^b的形式.现在 ...

  5. BZOJ 4537: [Hnoi2016]最小公倍数 [偏序关系 分块]

    4537: [Hnoi2016]最小公倍数 题意:一张边权无向图,多组询问u和v之间有没有一条a最大为a',b最大为b'的路径(不一定是简单路径) 首先想到暴力做法,题目要求就是判断u和v连通,并查集 ...

  6. 【LG3247】[HNOI2016]最小公倍数

    [LG3247][HNOI2016]最小公倍数 题面 洛谷 题解 50pts 因为拼凑起来的部分分比较多,所以就放一起了. 以下设询问的\(a,b\)为\(A,B\), 复杂度\(O(nm)\)的:将 ...

  7. 【bzoj4537】 Hnoi2016—最小公倍数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4537 (题目链接) 题意 给出一个${n}$个点${m}$条边的无向图,每条边有两个权值${a,b} ...

  8. 【 bzoj4537】HNOI2016 最小公倍数

    首先将边按a的值分组,每$\sqrt{m}$一组. 对于每一组,将符合一组a的询问选出来,将这些询问和这一块之前的边(a一定小于这些询问)按b排序,然后交替插入,询问,对于一个询问,在当前块也有可能有 ...

  9. 4537: [Hnoi2016]最小公倍数

    Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值.所有权值都可以分解成2^a*3^b的形式.现在有q个询问,每次询问给定四个参数u.v.a和b,请你 ...

随机推荐

  1. checkbox复选框全选

    HTML: <input type="checkbox" class="all"> <input type="checkbox&qu ...

  2. 四、优化及调试--网站优化--Yahoo军规中

    8.避免使用CSS表达式(避免在CSS中使用Expressions) 什么是CSS表达式:是用来把CSS属性和JavaScript关联起来.

  3. shell学习三十四天----printf详解

    http://blog.csdn.net/shanyongxu/article/details/46744055

  4. JavaWeb学习之JSTL自定义标签库的使用、JSTL自定义函数库(7)

    一.自定义标签,步骤 * 确定需求 * <my:date /> 输出当前系统的时间 yyyy-MM-dd hh:mm:ss:SSS * 编写Java类 新建包名:com.yxl.tag,新 ...

  5. Windows 10 周年更新正式版下载 + win10 快捷键

    Windows 10 周年更新正式版  360云资源总汇(施工中): https://yunpan.cn/c6Svi7Az52XBs (提取码:e5dd)今后提到周年更新版.1607版或RS1版,都是 ...

  6. Delphi中的函数指针判断是否为空

    delphi函数指针 只有@@p才代表了函数指针本身的地址   assigned(p) 判断是否为空 或者用 @p=nil 来判断函数指针是不是为空 Delphi中的函数指针实际上就是指针,只是在使用 ...

  7. HP SAN Switch光纖交換機命令行畫zone

    有時候我們無法登陸網頁交互界面去操縱交換機,如下提供了命令行方式從交換機劃zone 1.創建別名 alicreate "SummaryDB_N", "211,14; 21 ...

  8. Win10 资源文件

    ResourceLoader rl = new ResourceLoader(); DisOutText.Text = rl.GetString("Display"); Resou ...

  9. ubuntu kylin中如何截图

    windows操作系统中,我通常使用的截图工具是QQ的“ctrl+alt+a”快捷键.但是在ubuntu中,linux qq常年不更新,我也就彻底放弃了使用了,反正ubuntu通常只是拿来开发.其实没 ...

  10. Toast通知

    win10 app 开发中Toast通知的模板只有一种,统一为 ToastGeneric 通用型通知,本文我们来讲讲 Toast 的 XML文档相关知识. 在以前8.1时候的Toast通知方式,到了W ...