Parallel Binary Search 并行二分

news/2025/2/28 12:52:46/文章来源:https://www.cnblogs.com/Young-Cloud/p/18743001

引入

有一些问题要求我们回答若干询问。这些询问通常都是互不相干的。有时候二分能够以 \(O(nlog(n))\) 的复杂度单独解决一个询问,但是对于所有的询问都采用二分的话就是 \(O(qnlog(n))\) 的复杂度会超时(可以看 ABC394 G 体会一下)。于是就有了并行二分这一解决方法。

并行二分

我们观察到在对所有的询问都进行二分时,重复 check 了非常多次。假设每个询问所设定的二分区间是 \([L, R]\),那么每个询问我们都对 \(L + R \over 2\) 这个点 check 了。实际上我们只需要 check 这个中点一次。并行二分所做的就是简化掉这些重复的 check。具体的做法就是对所有的询问都初始化二分区间为 \([L, R]\),然后在接下来的二分中先根据每个询问的 \(mid\) 值将询问归类, \(mid\) 值相同的询问在一起。然后对于所有可能的 \(mid\) 值依据题意从小到大或者从大到小 check,看是否满足一开始归为这类的询问。

比如 ABC394 G 并形二分的过程就是:

    // code ...std::vector A(q, 0), B = A, Y = A, C = A, D = A, Z = A, L(q, 1), R(q, M);std::vector mid(M + 1, std::vector<int>{});while (true) {// 将上次归的类清空// M 是二分区间的右区间for (int i = 1; i <= M; i++) {mid[i].clear();}bool ok = true; // 是否所有询问都找到了答案for (int i = 0; i < q; i++) {if (L[i] <= R[i]) { // 这里的条件就是二分结束的条件,个人喜欢带等号ok = false;// 归类mid[L[i] + R[i] >> 1].push_back(i);}}if (ok) { // 都找到答案了就 break 掉break;}for (int i = 0; i < h * w; i++) {fa[i] = i;}// 从大到小遍历for (int i = M, j = 0; i >= 1; i--) {if (mid[i].empty()) {continue;}// 加入符合条件的边while (j < edge.size() && edge[j][2] >= i) {merge(edge[j][0], edge[j][1]);j++;}for (auto &id : mid[i]) {// 如果在一个连通块里if (get(A[id] * w + B[id]) == get(C[id] * w + D[id])) {L[id] = i + 1;}// 否则else {R[id] = i - 1;}}}}// code ...

觉得没看懂也可以看看这篇:Parallel Binary Search [tutorial]

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

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

相关文章

如何判断大小端?

联合体成员低地址对齐方法一:联合体 #include <stdio.h> #include <malloc.h>union myunion {int a;char b; };int main(void) {union myunion test;test.a = 0x12345678; if (test.b == 0x78)printf("小端模式"); else if (test.b == 0x12)printf(&q…

hexo 本地启动项目 hexo-browsersync 不工作原因总结

问题 1 : hexo-server 开启 compress 压缩后 hexo-browsersync 插件热更新完全无效,没办法自动刷新 此问题表现在 hexo 任何版本 问题原因: hexo-server 依赖 compression^1.7.4 会自动安装 compression@1.8.0,压缩后 Content-Encoding 不是 gzip 而是 br, hexo-browsersy…

共振底选股思路和案例

当前时间: 2025年2月28日 主图中的所有提示都编写了选股指标,我无偿分享。 共振底选股思路: 在短线、中线均都向上的情况下,同时出现以下条件的两个以上,则为共振底。 1. 1025战法的低吸位附近出现止跌阳线。 2. 小底图形反包。 3. 泰乐KDJ副图指标显示【大进】、【逛进】…

Vue2/Vue3 项目生产环境开启 vue devtools 插件线上调试 vue 组件

说到 vue 项目的调试工具,必然少不了 “vue devtools 插件”,此插件就像“手术刀”一样,是开发环境下的一个利器,生产环境一般情况没办法使用。 要在生产环境使用,就必须要一点手段。前置条件安装 Chrome 浏览器,本文编写时使用的 Google Chrome 133 版本。 安装 vue dev…

Windows编程系列:获取系统BIOS信息

在前面的文章中,介绍过WMI的使用 https://www.cnblogs.com/zhaotianff/p/14764740.html在Win32 Provider下面提供了一个Win32_BIOS类,可以获取BIOS信息我们还可以通过SMBIOS标准规范来获取BIOS信息SMBIOS介绍 SMBIOS (System Management BIOS ,系统管理BIOS)是通过系统固件…

【大模型安全】大模型攻击测试案例分析

本节通过对实际案例的研究,直观展示大模型(LLM)攻击测试是如何识别模型中存在的安全隐患。为确保被测大模型系统的安全运行,我们仅执行了无危害的查询操作,目的是发现潜在的安全漏洞和风险点。 案例1: 某互联网厂商LLM存在远程代码执行漏洞(过度代理),攻击者可通过此漏…

谷歌 Chrome 浏览器离线安装 vue devtools 插件

由于某些原因,Chrome 应用商店访问不了,所以只能离线安装 vue devtools 插件,离线安装也有两种方法。 方法一:自编译 vue devtools 插件 这方法要求动手能力强的同学。前往 github 下载 vue devtools 插件源码(https://github.com/vuejs/devtools)。在本地编译源码。编译成…

CRM选型避坑指南:别踩这些常见雷区!

选CRM就像找工作,选错了不仅折腾自己,还浪费时间和钱。 市面上CRM那么多,花里胡哨的功能一堆,价格跨度也大,选起来就像进了迷宫,一不小心就掉坑里。所以今天就聊聊那些常见的选型雷区,教你如何避开这些坑,选到真正适合自己的CRM!这里整理好了最好用CRM系统——简道云 …

医院HIS系统通过互联网调用医保内网(专网)接口

前言其实更准确的主题应该为:如何通过互联网访问专网服务器的http 服务,因为原理是一样的。全国医保刚实行升级时,很多HIS开发人员通过远程医院前置机再跳转医保网进行调试,操作很麻烦,如果能在办公室通过互联网直接访问医保网那就太方便了。全国医保的接口都是通过http方…

No.26 JavaScript--简介

前端3件套:HTML CSS JS 一、JS简介JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”,指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序的“脚本”。 JavaScript 是一种嵌入式(embedded)语言。它本身提供的核心语法不算很多。1.为什么学JS操控浏…

打造自主高效团队:企业团队协作工具私有化部署指南

企业团队协作工具的私有化部署是指将软件部署在企业自有的服务器上,而非使用公有云或第三方平台。以下是对企业团队协作工具私有化的详细分析: 一、私有化的优势 ● 数据安全可控:企业数据存储在本地服务器,无需上传至第三方平台,有效降低数据泄露风险,满足企业对数据安全…

快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿

在 Redis 中有两个定义:一个缓存击穿、一个缓存穿透,因为二者的名字比较像,因此很容易就搞混了。但本文会给你提供一个记忆的小技巧,帮你彻底区分二者的定义。 在讲这个技巧之前,我们先来了解一下二者的区别。 1.定义与区别缓存穿透(Cache Penetration):缓存穿透是指查…