题解 洛谷 P3247 【[HNOI2016]最小公倍数】
题意可以转化为是否能找一条从\(u\)到\(v\)的路径,经过的边的\(a\)和\(b\)的最大值恰好都是询问所给定的值。
若只有\(a\)的限制,可以将询问离线,对边和询问都从小到大排序,然后双指针维护当前合法的边,用并查集维护连通块的最值和连通性。
现在有\(a\)和\(b\)的限制,考虑对边分块,先对所有边按\(a\)从小到大排序,对所有询问按\(b\)从小到大排序。
考虑当前枚举到的一个块及其之前块对询问的贡献。对所有询问找到\(a\)大小恰好在当前块范围内的询问,对当前块之前的整块按\(b\)从小到大排序,这样就能保证在当前块之前的所有边的\(a\)都小于等于现在找到的这些询问,然后这些边对\(b\)都有序,因为已经事先已经对询问排过序,所以可以像只有一个限制时一样,对当前块之前的整块进行双指针维护对当前询问合法的边。
对于零散块内的边,可以直接暴力枚举,如果合法就加入,当考虑到下一个询问时,对于零散块内加入的边要执行删除,所以用可撤销并查集来维护即可。
\(code:\)
#include<bits/stdc++.h>
#define maxn 200010
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,m,qu,S,top;
int ans[maxn],fa[maxn],de[maxn],va[maxn],vb[maxn];
struct node
{
int x,y,a,b,id;
}e[maxn],q[maxn],t[maxn];
bool cmp1(const node &x,const node &y)
{
if(x.a==y.a) return x.b<y.b;
return x.a<y.a;
}
bool cmp2(const node &x,const node &y)
{
if(x.b==y.b) return x.a<y.a;
return x.b<y.b;
}
struct Node
{
int x,y,deep,a,b;
}st[maxn];
int find(int x)
{
return fa[x]==x?x:find(fa[x]);
}
void merge(int x,int y,int a,int b)
{
x=find(x),y=find(y);
if(de[x]<de[y]) swap(x,y);
st[++top]=(Node){x,y,de[x],va[x],vb[x]};
va[x]=max(va[x],a),vb[x]=max(vb[x],b);
if(x==y) return;
fa[y]=x,de[x]=max(de[x],de[y]+1);
va[x]=max(va[x],va[y]),vb[x]=max(vb[x],vb[y]);
}
bool query(int id)
{
int x=find(t[id].x),y=find(t[id].y);
if(x!=y) return false;
if(va[x]!=t[id].a||vb[x]!=t[id].b) return false;
return true;
}
void del(int id)
{
int x=st[id].x,y=st[id].y;
fa[y]=y,de[x]=st[id].deep,va[x]=st[id].a,vb[x]=st[id].b;
}
int main()
{
read(n),read(m),S=sqrt(m*log2(n));
for(int i=1;i<=m;++i)
read(e[i].x),read(e[i].y),read(e[i].a),read(e[i].b);
read(qu);
for(int i=1;i<=qu;++i)
read(q[i].x),read(q[i].y),read(q[i].a),read(q[i].b),q[i].id=i;
sort(e+1,e+m+1,cmp1),sort(q+1,q+qu+1,cmp2);
for(int i=1;i<=m;i+=S)
{
int tot=0,pos=1;
for(int j=1;j<=n;++j) fa[j]=j,va[j]=vb[j]=-1,de[j]=0;
for(int j=1;j<=qu;++j)
if(q[j].a>=e[i].a&&(q[j].a<e[i+S].a||i+S>m))
t[++tot]=q[j];
if(!tot) continue;
if(i!=1) sort(e+1,e+i,cmp2);
for(int j=1;j<=tot;++j)
{
while(pos<i&&e[pos].b<=t[j].b)
merge(e[pos].x,e[pos].y,e[pos].a,e[pos].b),pos++;
top=0;
for(int k=i;k<i+S&&k<=m;++k)
if(e[k].a<=t[j].a&&e[k].b<=t[j].b)
merge(e[k].x,e[k].y,e[k].a,e[k].b);
ans[t[j].id]=query(j);
while(top) del(top--);
}
}
for(int i=1;i<=qu;++i)
{
if(ans[i]) puts("Yes");
else puts("No");
}
return 0;
}
题解 洛谷 P3247 【[HNOI2016]最小公倍数】的更多相关文章
- 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]
洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...
- 洛谷P3247 [HNOI2016]最小公倍数(分块 带撤销加权并查集)
题意 题目链接 给出一张带权无向图,每次询问\((u, v)\)之间是否存在一条路径满足\(max(a) = A, max(b) = B\) Sol 这题居然是分块..想不到想不到..做这题的心路历程 ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 题解-洛谷P5217 贫穷
洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...
随机推荐
- unknown directive "" in E:\canteen\nginx-1.16.0/conf/nginx.conf:3-------文本编辑器修改nginx配置文件的坑
nignx小白一个,今天在配置nginx的时候,理所当然的用了文本编辑器编辑并保存了一下nginx的nginx.conf配置文件,一不小心就折腾了几个钟. 保存之后就nginx -s reload一下 ...
- Linux Pam后门总结拓展
首发先知社区: https://xz.aliyun.com/t/7902 前言 渐渐发现pam后门在实战中存在种植繁琐.隐蔽性不强等缺点,这里记录下学习pam后门相关知识和pam后门的拓展改进. 0x ...
- 一小时彻底搞懂RabbitMQ
windows上面安装rabbitmq-server-3.7.4.exe 首先需要安装otp_win64_20.3.exe 步骤1:安装Erlang RabbitMQ 它依赖于Erlang,需要先安装 ...
- 关于MySQL事务和存储引擎常见FAQ
1.什么是事务? 事务就是「一组原子性的SQL查询」,或者说一个独立的工作单元.如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询.如果其中有任何一条语句因为崩溃或其他原因无法 ...
- web如何测试
当我们负责web测试的时候,先了解B/S架构,然后分析如何开始执行测试,一般步骤:从功能测试,兼容测试,安全测试. 功能测试: 一.链接测试,链接是web应用系统的一个很重要的特征,主要是用于页面之间 ...
- Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
问题原因是Hive里面配置的相对路径没有找到,我们可以直接在文件里面修改为绝对路径. 1.在hive下面窗口temp文件夹 cd /opt/hive mkdir temp cd temp 2.查看te ...
- Halcon斑点分析涉及算子及其高阶运用
涉及算子 获取图像 使用ROI 对齐ROI或图像 校正图像 基础内容这里不再重述 预处理图像(过滤) 基础: mean_image(平均平滑过滤),gauss_filter(高斯滤波),binomia ...
- (私人收藏)古风PPT高级灰蓝传艺
古风PPT高级灰蓝传艺 https://pan.baidu.com/s/1ADgTfif8i6JqKORLXhTHHgn05p
- 阿里云Linux CentOS8.1 用 xshell 上传和下载文件
下载: 例如有一个script 文件夹,我们要把它打包成 tar文件,并下载到本地.具体命令如下: 1.进入script 所在的目录,先打包,命令如下: tar -cvf script.tar scr ...
- (三)ansible playbook
一,YAML语法 YAML的语法和其他高阶语言类似并且可以简单表达清单.散列表.标量等数据结构.(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对) YAML文件扩展名通常为.yaml ...