HNOI2016 最小公倍数 题解

news/2024/12/25 22:21:08/文章来源:https://www.cnblogs.com/dccy/p/18631540

HNOI2016 最小公倍数 题解

很神秘的分块优化暴力。

首先有一个暴力的想法,每次取出所有 \(a\le A,b\le B\) 的边,实际上就是判断 \(u,v\) 是否连通且连通块内是否有 \(a_{max}=A,b_{max}=B\)。这样是 \(O(mq)\) 的。

考虑对所有边按 \(a\) 排序,然后每 \(B\) 个分块。

我们考虑处理 \(A\) 在当前块 \(a\) 范围内的询问,那么前面的块的 \(a\) 一定满足限制。

考虑怎样满足 \(B\) 的限制,我们可以对前面块的所有边按 \(b\) 排序,然后双指针用并查集加边。

而对于当前块内同时满足 \(A,B\) 限制的边,这些边集并不是互相包含的,所以我们要独立贡献它们,用所有满足的边在缩完的并查集上跑搜索即可。

那么排序部分是 \(O(\frac {m^2}B\log m)\),对前面的块加边是 \(O(\frac {m^2}B\alpha(n))\),而对于块内的搜索是 \(O(qB\alpha(n))\) 的。

总复杂度应为 \(O(\frac {m^2}B\log m+qB)\)。取 \(B=O(\frac m{\sqrt q})\) 时,复杂度达到 \(O(m\sqrt q\log m)\)

细节

  • 对于连向同一连通块内的边,记得更新 \(maxa,maxb\)

  • 记得询问和边都要排序。

  • 由于有询问的 \(a,b=0\) 的情况,所以 \(maxa,maxb\) 的初值需要设为 \(-1\)

  • 如果是用指针扫询问,记得要把询问的 \(a\) 小于边权的 \(\min\{a\}\) 的询问过滤掉。

AC 代码:

const int N=1e5+5;
const int B=448;
int n,m;
struct arr{int u,v,a,b,num;void Read(){return read(u,v,a,b);}
};
int fa[N],sz[N];
int getfa(int x){if(fa[x]==x)return x;return fa[x]=getfa(fa[x]);
}
int maxa[N],maxb[N];
void merge(int x,int y,int a,int b){x=getfa(x),y=getfa(y);if(x==y){maxa[x]=max(maxa[x],a);maxb[x]=max(maxb[x],b);return ;}if(sz[x]<sz[y])swap(x,y);maxa[x]=max(maxa[x],maxa[y]);maxb[x]=max(maxb[x],maxb[y]);maxa[x]=max(maxa[x],a);maxb[x]=max(maxb[x],b);sz[x]+=sz[y];fa[y]=x;
}
arr e[N],q[N];
int Q;
int ans[N];
int vis[N],bid;
struct edge{int v,a,b;
};
vector<edge> g[N];
signed main(){read(n,m);fo(i,1,m){e[i].Read();}sort(e+1,e+m+1,[](arr a,arr b){return a.a<b.a;});read(Q);fo(i,1,Q){q[i].Read();q[i].num=i;}sort(q+1,q+1+Q,[](arr a,arr b){return a.a<b.a;});int L=1;e[m+1].a=1e9+1;while(L<=Q&&q[L].a<e[1].a)++L;for(int l=1,r;l<=m;l=r+1){r=min(m,l+B-1);sort(e+1,e+l,[](arr a,arr b){return a.b<b.b;});int R=L-1;while(R<Q&&q[R+1].a>=e[l].a&&q[R+1].a<=e[r].a&&q[R+1].a<e[r+1].a)++R;fo(i,1,n)fa[i]=i,sz[i]=1,maxa[i]=maxb[i]=-1;int t=1;sort(q+L,q+R+1,[](arr a,arr b){return a.b<b.b;});fo(i,L,R){while(t<l&&e[t].b<=q[i].b){merge(e[t].u,e[t].v,e[t].a,e[t].b);++t;}vector<int> vec;fo(j,l,r){if(e[j].a<=q[i].a&&e[j].b<=q[i].b){int a=getfa(e[j].u),b=getfa(e[j].v);g[a].push_back({b,e[j].a,e[j].b}),g[b].push_back({a,e[j].a,e[j].b}),vec.push_back(a),vec.push_back(b);}}++bid;queue<int> p;p.push(getfa(q[i].u)),vis[p.front()]=bid;int ma=-1,mb=-1,bz=0;while(p.size()){int u=p.front();p.pop();if(u==getfa(q[i].v))bz=1;ma=max(ma,maxa[u]),mb=max(mb,maxb[u]);for(auto v:g[u]){if(vis[v.v]!=bid){vis[v.v]=bid;p.push(v.v);}ma=max(ma,v.a),mb=max(mb,v.b);}}if(bz&&ma==q[i].a&&mb==q[i].b)ans[q[i].num]=1;for(auto x:vec)g[x].clear();}L=R+1;}fo(i,1,Q)if(ans[i])write("Yes\n");else write("No\n");return 0;
}

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

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

相关文章

wordpress固定链接设置

通过上面的测试发现,切换不同链接结构,同一张网页但是网址却发生了改变。 为什么要改变网址的结构? 主要原因,是为了搜索引擎优化。搜索引擎不喜欢带有问号的网址,也不喜欢层级特别深的网址。所以,WordPress允许你去设置网址的结构,让网址更符合搜索引擎的要求(官方说法…

【安全工具】蚁剑二开:添加自定义编码/解码器

以下文章来源于Spade sec ,作者0xsdeo 前言 我大概已经写了两三个月关于JS逆向的文章,正好前两天抽空研究了一下关于蚁剑如何添加编码/解码器,所以年底这几天就分享一些关于安全的内容,应该也是我放假前的最后两篇文章。 注:本人目前没有看过任何关于蚁剑二开文章,以下内…

【项目推荐】搭建自己的个人主页

你是否想过将自己的简历做成一个单页面的网站?在这个网站上可以自定义你想展示的内容,不只求职信息,求偶信息也可以!试试下面的代码吧。 本文首发于微信公众号 呼哧好大枫,原作者与本文作者系同一人。项目地址:http://hlt.cab/ 代码开源地址:中文:https://gitee.com/kk…

vue3 vite使用postcss-px-to-viewport 实现页面自适应

三、如何在 Vue3 中使用 postcss-px-to-viewport? 首先,我们需要安装相关的插件: npm install postcss-px-to-viewport -D 在vite.config.js文件中进行配置 import vue from @vitejs/plugin-vue // vite.config.ts import { defineConfig } from vite import AutoImport fro…

基于BP译码的LDPC误码率matlab仿真,分析不同码长,码率,迭代次数以及信道类型对译码性能的影响

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要低密度奇偶校验码(Low-Density Parity-Check Codes,LDPC)是一种具有逼近香农限性能的信道编码技术。在现代通信系统中,LDPC 码因其优异的…

PTA 两次大作业总结:详细分析与实践经验

PTA 两次大作业总结:详细分析与实践经验 前言 回顾这次的家居强电电路模拟程序大作业,它无疑是一段充满挑战与收获的编程与设计旅程。从最初的基础电路组件建模,到后期复杂的多设备互联与控制反馈,每一步都考验着我的技术能力和解决问题的智慧。这不仅让我深入掌握了诸多编…

Go init()使用详解

持续创作,加速成长!这是我参与「掘金日新计划 10 月更文挑战」的第1天,点击查看活动详情 1. init()的使用 见名知意,init()是Go中的初始化函数。我们都知道,main()函数是Go程序启动的入口,而init()函数就是在main()之前,起到一个初始化的作用。 Go代码解读 复制代码pa…

LangGraph:基于图结构的大模型智能体开发框架

LangGraph 是LangChainAI开发的一个工具库,用于创建代理和多代理智能体工作流。它提供了以下核心优势:周期、可控性和持久性,对于Agent智能体开发者来说无疑减少了许多工作量。以下篇幅仅从本人角度阐述LangGraph在开发过程中的亮点以及使用方法。 基本介绍 LangGraph的Stat…

P7302 [NOI1998] 免费的馅饼

P7302 [NOI1998] 免费的馅饼 题目描述 SERKOI 最新推出了一种叫做“免费馅饼”的游戏:游戏在一个舞台上进行。舞台的宽度为 \(w\) 格(从左到右依次用 \(1\) 到 \(w\) 编号),游戏者占一格。开始时游戏者可以站在舞台的任意位置,手里拿着一个托盘。下图为天幕的高度为 \(4\)…

CSRF跨站请求伪造攻击详解

本文为《白帽子Web讲安全(第2版)》——跨站请求伪造(CSRF)章节的阅读总结及摘录,详述了CSRF攻击的定义及防御方法等。一、CSRF攻击概述 1.1 CSRF攻击定义用户浏览器加载恶意网站时,浏览器中的恶意网站页面向另一目标网站自主发起一个恶意HTTP请求,该攻击方式即为CSRF攻击。…

R数据分析:工具变量回归的做法和解释,实例解析

前几天看了个视频,是2024年诺贝尔经济学奖得主在分享自己的研究,研究问题是“制度如何形成并影响经济繁荣”,在研究这个问题的时候他的PPT中提到研究的统计过程中用到了工具变量,想着再次大家介绍一下这个方法。说不定利用这个方法,哪天我的读者里面也出个诺贝尔奖得主呢,…

昆工25考研复试时间预测(信自院)

昆工昆明理工大学、计算机技术、人工智能、软件工程、网络空间安全、891计算机专业核心综合、计算机系统结构、计算机软件与理论、计算机应用技术、通信工程、817信号与系统、信号与信息处理、通信与信息系统、通信工程(含宽带网络、移动通信等)