P3247 [HNOI2016] 最小公倍数 解题报告

前置知识:可撤销并查集

用一个栈记录合并顺序,每次撤销将栈顶的元素恢复

但是这种方法不能路径压缩,因为会改变节点之间的关系,为了保证时间,可以按照 \(size\) 进行合并


题意显然为能不能找到一条路径,使这条路径上最大的 \(a\)\(qa\),最大的 \(b\)\(qb\)

因为有a和b两个限制,考虑按照a和b的大小分块

因为数的范围很大,所以可以按照先将边按a排序后的位置对应的值分块

对于每一段,记最小值为 \(mina\),最大值为\(maxa\)

先将满足 \(mina\le qa\le maxa\) 的询问加入s中

接下来考虑b的限制,因为此时a的问题已经解决了,所以可以对 \(a\le mina\)的边按b从小到大排序

为了便于边的插入和删除,可以先将询问按b从小到大排序

此时,依次枚举s中的询问,加入满足 \(a\le mina,b\le qb\) 的边,因为b是递增的,所以这些边加入后始终满足条件,不用删除

对于 \(mina\le qa\le maxa\) 的边,因为不一定满足条件,所以要利用可撤销并查集,对于每个询问,只加入符合条件的边,用完后撤销

此时,如果所求的u和v在同一个连通块,且块内最大的a和b均与所求相等,则答案为Yes,否则为No

代码:

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,q,blen,cnt,ans[50005];
struct node{int u,v,a,b,id;
}e[100005],qs[50005],s[50005];
bool cmp1(node x,node y)
{if(x.a==y.a) return x.b<y.b;return x.a<y.a;
}
bool cmp2(node x,node y)
{if(x.b==y.b) return x.a<y.a;return x.b<y.b;
}
int f[500005],siz[100005],maxa[100005],maxb[100005],top;
int find(int x)
{if(f[x]!=x) return find(f[x]);return x;
}
struct node1{int x,y,maxa,maxb,siz,fa;
}st[100005];
void merge(int u,int v,int a,int b)
{int x=find(u),y=find(v);if(siz[x]<siz[y]){swap(x,y),swap(u,v);}top++;st[top]=(node1){x,y,maxa[x],maxb[x],siz[x],f[y]};if(x==y){maxa[x]=max(maxa[x],a);maxb[x]=max(maxb[x],b);return;}f[y]=x;siz[x]+=siz[y];maxa[x]=max(maxa[x],max(maxa[y],a));maxb[x]=max(maxb[x],max(maxb[y],b));
}
void split()
{while(top){siz[st[top].x]=st[top].siz;maxa[st[top].x]=st[top].maxa;maxb[st[top].x]=st[top].maxb;f[st[top].y]=st[top].fa;top--;}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int u,v,a,b;scanf("%d%d%d%d",&u,&v,&a,&b);e[i]=(node){u,v,a,b,i};}scanf("%d",&q);for(int i=1;i<=q;i++){int u,v,a,b;scanf("%d%d%d%d",&u,&v,&a,&b);qs[i]=(node){u,v,a,b,i};}sort(e+1,e+m+1,cmp1);sort(qs+1,qs+q+1,cmp2);blen=sqrt(m);for(int i=1;i<=m;i+=blen){cnt=0;for(int j=1;j<=q;j++){if(qs[j].a>=e[i].a&&(i+blen>m||qs[j].a<e[i+blen].a)){s[++cnt]=qs[j];}}sort(e+1,e+i+1,cmp2);for(int j=1;j<=n;j++){f[j]=j,siz[j]=1;maxa[j]=maxb[j]=-1;}for(int j=1,k=1;j<=cnt;j++){while(k<i&&e[k].b<=s[j].b){merge(e[k].u,e[k].v,e[k].a,e[k].b);k++;}top=0;for(int l=i;l<i+blen&&l<=m;l++){if(e[l].a<=s[j].a&&e[l].b<=s[j].b){merge(e[l].u,e[l].v,e[l].a,e[l].b);}}int x=find(s[j].u),y=find(s[j].v);if(x==y&&maxa[x]==s[j].a&&maxb[x]==s[j].b) ans[s[j].id]=1;split();}}for(int i=1;i<=q;i++){if(ans[i]) printf("Yes\n");else printf("No\n");}return 0;
}

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

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

相关文章

电源中TL431及光耦的实战运用

首先了解一下TL431的基本原理;由一个运放及三极管组成;运放的应用前文略有几笔,此处未加反馈,运放只需要同相端与反相端做差在输出对应电压即可,而三极管是电压驱动;当VREF>2.5V即同相端大于反相端,输出正电压,三极管导通,当VREF<2.5V即同相端小于反相端,输出负…

在OERV也可以玩MC(下)

话接上回,上期讲述了在OERV安装HMCL的历程,这期讲讲HMCL的打包。Show openEuler:24.09 / HMCL - 开源软件构建与测试。在这个网站里,可以看到有好几个文件,这些都跟HMCL打包有关。 第一个是_service文件,这个文件用于从特定仓库里面拉取代码文件到当前平台,可以看见每个文…

JS-38 对象概述

什么是对象?对象(object)是JavaScript语言的核心概念,也是最重要的数据类型 简单说,对象就是一组“键对值”(key-value)的合集,是一种无序的复合数据集合 var user={ name:zifuchuan, age:13 };对象的每一个键名又称为属性(property),它的“键值”可以是任何数据类型…

第八届工业信息安全技能大赛全国复赛snake_wp

pwn题 snake writeup多少有点不自信,太久没做题,看到题都有点怕怕的这个程序是一个贪食蛇游戏,主程序如下: __int64 __fastcall main_4015A5(__int64 a1, __int64 a2) {int v2; // edxint v3; // ecxint v4; // er8int v5; // er9int v7; // [rsp+Ch] [rbp-4h]sub_400B6D()…

初识Spring -2025/1/12

bean的生命周期初始化容器1.创建对象(内存分配) 2.执行构造方法 3.执行属性注入(set操作) 4.执行bean初始化方法使用bean1.执行业务操作关闭/销毁容器1.执行bean销毁方法(3)关闭容器的两种方式:ConfigurableApplicationContext是ApplicationContext的子类close()方法 registerS…

Linux命令【date】格式化

作用:显示或设定系统的日期与时间 格式化

高效协作与工时优化的结合点在哪里

在信息化高速发展的今天,如何提升团队的协作效率、优化工时管理,已经成为每个企业面临的挑战。在线文档协作工具因其实时共享、多端同步、权限控制等功能,成为现代企业数字化办公的重要一环。本文将分析在线协作工具如何助力办公室团队优化工时管理,从而实现高效办公。一、…

easyexcel doRead bug

public class CarOilingRecordImportVO { /** * 油卡号 */ @ExcelProperty(value = "卡号/客户编号") @NotNull(message = "卡号/客户编号不能为空") private String cardCode; /** * 车牌号 */ @ExcelProperty(value =…

为什么人工智能会导致更大的社会不平等……至少在开始时如此

为什么人工智能会导致更大的社会不平等……至少在开始时如此 一次巨大变革的不对称性来源:作者使用GPT-4o撰写虽然每一次技术革命都创造了比毁掉的工作岗位更多的就业机会,人工智能也不会例外。然而,我们正迎来向那个世界转变的一个极其复杂的阶段。 简单来说,未来几年人工…

(二)C#同一个项目窗体应用程序复制粘贴窗体文件出现各种bug正确解决办法

事情是这样的,如上图所示,因为一个系统里面有好几个子系统,有些子系统之间的“增删查改”又是相通的,于是想通过复制相同的窗体到另外一个文件夹的时候,如果不正确引用“新项目”将会出现以上各种错误。在网上搜索了各种方式,尝试了各种办法,最后找到下面这种亲测有效的…

进度追踪与任务管理:提升团队效率的核心利器

一、高效协作管理工具的定义与重要性 高效协作管理工具是指能够支持团队成员之间顺畅沟通、任务高效分配、进度实时跟踪、工作流程协同的工具。这些工具通常具备任务管理、文件共享、日程安排、团队沟通、进度追踪等功能,旨在帮助团队更好地合作、提高效率。 在快速发展的商业…