当前位置: 首页 > news >正文

【思维】根号分治

写在前面的话:

个人理解 根号分治本身就是一种卡着评测机过题的做法,所以非必要不要写 #define int long long !!!


本篇博客参考:暴力美学——浅谈根号分治

做到过两三题根号分治了,来总结一下这个算法

与其说是算法,不如说是一种思维

根号分治的主要思路是,数据范围很大的时候(指不能接受 n 2 n^2 n2 复杂度,但可以接受 n n n\sqrt n nn 复杂度的情况,通常是 1 e 8 − 1 e 9 1e8-1e9 1e81e9),将数据分为两个部分,一个是小于 n \sqrt n n 的部分,一个是大于等于 n \sqrt n n 的部分,两个部分分别采用不同的处理方式:

  • 第一个部分(需要处理的间隔小的部分),使用技巧计算,例如前缀和等预处理算法
  • 第二个部分(需要处理的间隔大的部分),暴力计算

下面举例说明几个可以使用根号分治的场景

    • 数据结构
    • 数论

数据结构

来一道例题:F. Remainder Problem

题目意思是,给出一个长度为 5 e 5 5e5 5e5 的序列,初始值都是 0,给出 q 组操作,每组操作包括 op x y

  • op == 1 时,a[x] += y
  • op == 2 时,输出下标模 x 等于 y 的位置的值之和

我们可以想到两种做法:

  1. 暴力处理,第一个操作就直接加,复杂度 O ( 1 ) O(1) O(1),第二个操作就遍历一遍数组,复杂度 O ( n ) O(n) O(n),这样最坏的复杂度是 O ( n q ) O(nq) O(nq),T
  2. 利用二维数组预处理,b[i][j] 表示模 i 等于 j 的位置上的值之和,第一个操作就遍历更新 b[i][j],复杂度 O ( n ) O(n) O(n),第二个操作直接输出,复杂度 O ( 1 ) O(1) O(1),最坏的复杂度是 O ( n q ) O(nq) O(nq),T

那能不能把两者结合起来呢?

我们发现如果 x 比较大的话,暴力处理的第二个操作复杂度就不会太高,但是不能进行预处理(空间上不能接受),x 比较小的话,可以进行预处理,而暴力操作的复杂度就会比较高

说到这里就清楚啦:x 大就第一个做法,x 小就第二个做法,大小的分界线是什么呢?就是 n \sqrt n n

c o d e code code

#include <bits/stdc++.h>using namespace std;// #define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;const int N = 5e5 + 10;
const int maxn = 710;
const int mod = 1e9 + 7;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;int a[N], b[710][710];void solve()
{int q;cin >> q;while (q -- ){int op, x, y;cin >> op >> x >> y;if (op == 1){a[x] += y;for (int i = 1; i < 700; i ++ ) b[i][x % i] += y;}else{if (x < 700) cout << b[x][y] << '\n';else{int res = 0;for (int i = y; i <= 5e5; i += x) res += a[i];cout << res << '\n';}}}
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;// cin >> t;while (t--){solve();}
}

数论

看这题:D. Two Arithmetic Progressions

题目给出这样的两个数列:

  • a 1 k + b 1 a_1k+b_1 a1k+b1
  • a 2 k + b 2 a_2k+b_2 a2k+b2

k > = 0 k>=0 k>=0

然后给出 [ l , r ] [l,\ r] [l, r],问这个区间里有多少数同时存在于上面的两个数列里( a 、 b a、b ab 的范围都是 2 e 9 2e9 2e9

我们还是想出两种办法:

  • k 从 0 开始,枚举第一个数列的数,直到找到一个在第二个数列里也出现的数(可以发现最多找 max(a1, a2) 次),之后每次加上循环节(也就是 a 1 a_1 a1 a 2 a_2 a2 的最小公倍数)即可
  • 枚举 a a a 值较大的数列,符合条件就答案+1,完全暴力

maxx = max(a1, a2)

  • 当 maxx 比较大的时候,数列里的值的数量就会比较少,可以通过枚举解决问题,但使用第一种方法就会T

  • 当 maxx 比较小的时候,枚举会T,但可以使用第一种找循环节的方法

所以通过这个进行根号分治,结束!

(其实这题的正解并不是根号分治,但是使用这种思想可以直接碾过去cf2500的题!!好爽ovo)

c o d e code code

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;const int N = 2e9;
const int maxn = 710;
const int mod = 1e9 + 7;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int a1, b1, a2, b2, l, r;cin >> a1 >> b1 >> a2 >> b2 >> l >> r;int maxx = max(a1, a2);if (maxx < sqrt(N)) // 找最小公倍数{for (int i = 0; i <= maxx; i ++ ){int tmp = a1 * i + b1;if (abs(tmp - b2) % a2 == 0){int lcmm = lcm(a1, a2);int st = max({l, b1, b2});if (tmp < st){tmp += ((st - tmp) / lcmm + 1) * lcmm;tmp = st + (tmp - st) % lcmm;}else tmp = st + (tmp - st) % lcmm;if (tmp > r) continue;cout << (r - tmp) / lcmm + 1 << '\n';return;}}cout << 0 << '\n';}else // 暴力{int ans = 0;if (a1 < a2) swap(a1, a2), swap(b1, b2);for (int i = b1; i <= r; i += a1){if (i < l || i < b2) continue;if ((i - b2) % a2 == 0) ans ++ ;}cout << ans << '\n';}
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;// cin >> t;while (t--){solve();}
}

相关文章:

【思维】根号分治

写在前面的话&#xff1a; 个人理解 根号分治本身就是一种卡着评测机过题的做法&#xff0c;所以非必要不要写 #define int long long &#xff01;&#xff01;&#xff01; 本篇博客参考&#xff1a;暴力美学——浅谈根号分治 做到过两三题根号分治了&#xff0c;来总结一下…...

Linux线程(三)死锁与线程同步

目录 一、什么是死锁 死锁的四个必要条件 如何避免死锁 避免死锁算法 二、Linux线程同步 三 、条件变量 1、条件变量基本原理 2、条件变量的使用 3、条件变量使用示例 为什么 pthread_cond_wait 需要互斥量? 一、什么是死锁 死锁是计算机科学中的一个概念&#xff0c;…...

SpringAMQP 发布订阅-TopicExchange

根据这个模型编写代码: RabbitListener(bindings QueueBinding(value Queue(name "topic.queue1"),exchange Exchange(name "itcast.topic",type ExchangeTypes.TOPIC),key {"china.#"}))public void listenTopicQueue1(String msg){Syst…...

uniapp h5 配置代理服务器

"devServer": {"disableHostCheck": true,"proxy": {"/api": {// 需要被代理的后台地址"target": "http://自己的地址","changeOrigin": true,"secure": false,"pathRewrite": {&q…...

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移 在本文中&#xff0c;将介绍如何构建一个实时数据pipeline&#xff0c;从MySQL数据库读取数据&#xff0c;通过Kafka传输数据&#xff0c;最终将数据存储到HDFS中。我们将使用Apache Spark的结构化流处理和流处理功能&#…...

一篇文章拿下Redis 通用命令

文章目录 Redis数据结构介绍Redis 通用命令命令演示KEYSDELEXISTSEXPIRE RedisTemplate 中的通用命令 本篇文章介绍 Redis 的通用命令, 通用命令在 Redis 的所有数据类型下都使用, 学好通用命令可以让我们更好的使用 Redis. Redis数据结构介绍 Redis 是一个key-value的数据库&…...

锂电池充电充放电曲线分析

前言 锂电池的充电曲线通常包括三个阶段:恒流充电阶段、恒压充电阶段和滞后充电阶段。在恒流充电阶段,电流保持恒定,电压逐渐增加;在恒压充电阶段,电压保持恒定,电流逐渐减小;在滞后充电阶段,电流进一步减小,电池开始充满。通过监测这些阶段的电流和电压变化,可以评…...

vue3 第二十九节 (vue3 事件循环之nextTick)

引言 vue 项目中为什么要使用 nextTick 这个函数&#xff0c;是做什么用的&#xff0c;解决了哪些问题 1、nextTick 作用 用于处理DOM更新完成之后&#xff0c;执行回调函数的方法&#xff1b; 2、实现方案 vue2 中 nextTick() 是基于浏览器的 异步队列和微任务队列而执行…...

使用Flask-SocketIO构建实时Web应用

文章目录 准备工作编写代码编写HTML模板运行应用 随着互联网的发展&#xff0c;实时性成为了许多Web应用的重要需求之一。传统的HTTP协议虽然可以实现实时通信&#xff0c;但是其长轮询等机制效率低下&#xff0c;无法满足高并发、低延迟的需求。为了解决这一问题&#xff0c;诞…...

可重构柔性装配产线:为工业制造领域注入了新的活力

随着科技的飞速发展&#xff0c;智能制造正逐渐成为引领工业革新的重要力量。在这一浪潮中&#xff0c;可重构柔性装配产线以其独特的技术优势和创新理念&#xff0c;为工业制造领域注入了新的活力&#xff0c;开启了创新驱动的智能制造新篇章。 可重构柔性装配产线是基于富唯智…...

懒人网址导航源码v3.9

测试环境 宝塔Nginx -Tengine2.2.3的PHP5.6 MySQL5.6.44 为防止调试错误&#xff0c;建议使用测试环境运行的php与mysql版本 首先用phpMyAdmin导入数据库文件db/db.sql 如果导入不行&#xff0c;请直接复制数据库内容运行sql语句也可以 再修改config.php来进行数据库配置…...

springboot 开启缓存 @EnableCaching(使用redis)

添加依赖 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>application.yml 配置redis连参数 spring:# redis 配置redis:# 地址host: 127.0.0.…...

Adobe After Effects AE v24.3.0 解锁版 (视频合成及视频特效制作)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 解锁版 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 解锁版 (视…...

Qt---文件系统

一、基本文件操作 1. QFile对文件进行读和写 QFile file( path 文件路径) 读&#xff1a; file.open(打开方式) QlODevice::readOnly 全部读取->file.readAll()&#xff0c;按行读->file.readLine()&#xff0c;atend()->判断是否读到文件尾 …...

ruoyi-vue-pro 使用记录(2)

ruoyi-vue-pro 使用记录&#xff08;2&#xff09; 数据库商城商品模块数据表营销数据库交易数据库统计数据库 数据库 商城 参考官方文档 ruoyi-vue-pro yudao 项目商城 mall 模块启用及相关SQL脚本 商品模块&#xff08;中心&#xff09;以 product_ 作为前缀的表交易模块…...

centos7中如何全局搜索一下nginx的配置文件?

在CentOS 7中搜索Nginx的配置文件&#xff0c;你可以使用一些常用的命令行工具&#xff0c;比如find、grep等。这些工具可以帮助你在文件系统中查找文件&#xff0c;也可以用来查找Docker容器内部的文件&#xff0c;只要你知道如何访问容器的文件系统。 1. 搜索系统中的Nginx配…...

2024年5月10日有感复盘

2024年5月10日有感复盘 时间 今天是一个很美好的一天&#xff0c;原因是很平凡&#xff0c;读书很平凡&#xff0c;玩游戏很平凡&#xff0c;然后生活很平凡&#xff0c;未来可期&#xff0c;听歌很舒服&#xff0c;很喜欢一个人呆在图书馆的感觉&#xff0c;很喜欢发呆&…...

C++通过json文件配置参数

一、安装nlohmann json nlohmann json&#xff1a;安装_nlohmann安装-CSDN博客 依次执行下面指令&#xff1a; git clone https://gitee.com/cuihongxi/mov_from_github.gitcd json-developmkdir buildcd buildcmake ..makesudo make install 二、安装完成后使用 #include…...

idea连接远程仓库

git ->克隆。 url为远程仓库的地址&#xff0c;输入好后&#xff0c;选择项目存放目录&#xff0c;再点击克隆 点击新窗口打开。 切换到对应分支...

初始Django

初始Django 一、Django的历史 ​ Django 是从真实世界的应用中成长起来的&#xff0c;它是由堪萨斯&#xff08;Kansas&#xff09;州 Lawrence 城中的一个网络开发小组编写的。它诞生于 2003 年秋天&#xff0c;那时 Lawrence Journal-World 报纸的程序员 Adrian Holovaty 和…...

OpenClaw权限精细化控制:Qwen2.5-VL-7B模型访问目录限制

OpenClaw权限精细化控制&#xff1a;Qwen2.5-VL-7B模型访问目录限制 1. 为什么需要权限控制 最近在本地部署了Qwen2.5-VL-7B多模态模型&#xff0c;通过OpenClaw实现自动化办公流程时&#xff0c;突然意识到一个问题&#xff1a;当AI助手能自由访问我的整个文件系统时&#x…...

Recaptcha2 图像识别 API 集成指南

在本篇文章中&#xff0c;我们将介绍如何集成 Recaptcha2 图像识别 API。该 API 可以识别用户输入的内容和 Recaptcha2 验证图像&#xff0c;最终返回需要点击的小图像的坐标&#xff0c;以完成验证。 环境准备 在使用 API 之前&#xff0c;您需要在 Recaptcha2 图像识别 API…...

塞尔达传说旷野之息存档编辑器:终极免费工具使用指南 [特殊字符]

塞尔达传说旷野之息存档编辑器&#xff1a;终极免费工具使用指南 &#x1f3ae; 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 还在为海拉鲁大陆的冒险资源不足而…...

写程序茶叶/咖啡包装日期密封标,易撕不损盒,输出:小众商家定制包装,提升质感。

项目方案&#xff1a;基于Python的激光易撕密封标牌生成系统一、 实际应用场景描述想象一下&#xff0c;你走进一家主打手冲咖啡或高端岩茶的精品买手店。他们售卖的是50g 装的挂耳咖啡包或散装岩茶罐。传统的解决方案是贴一张简陋的不干胶标签&#xff0c;写上日期&#xff0c…...

C#的LINQ查询表达式编译原理与性能优化

C#的LINQ查询表达式编译原理与性能优化 LINQ&#xff08;Language Integrated Query&#xff09;是C#中强大的数据查询工具&#xff0c;它将查询能力直接集成到语言中&#xff0c;使开发者能够以声明式方式操作数据。理解其编译原理与性能优化技巧&#xff0c;对于编写高效代码…...

华硕笔记本终极性能优化工具:G-Helper完整使用指南

华硕笔记本终极性能优化工具&#xff1a;G-Helper完整使用指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar,…...

StructBERT-中文-large惊艳效果展示:中文新闻事件多源报道语义聚合案例

StructBERT-中文-large惊艳效果展示&#xff1a;中文新闻事件多源报道语义聚合案例 1. 引言&#xff1a;当新闻铺天盖地而来&#xff0c;如何看清真相&#xff1f; 你有没有过这样的经历&#xff1f;一个热点事件爆发&#xff0c;打开手机&#xff0c;各种新闻App、社交媒体、…...

SecGPT-14B模型微调:OpenClaw自动化准备标注数据与训练脚本

SecGPT-14B模型微调&#xff1a;OpenClaw自动化准备标注数据与训练脚本 1. 为什么需要自动化微调流程 当我第一次尝试微调SecGPT-14B模型时&#xff0c;最让我头疼的不是模型本身&#xff0c;而是那些繁琐的前期准备工作。作为安全领域的从业者&#xff0c;我深知专业数据的价…...

OpenClaw自动化测试新思路:千问3.5-27B生成与执行UI测试用例

OpenClaw自动化测试新思路&#xff1a;千问3.5-27B生成与执行UI测试用例 1. 为什么我们需要重新思考UI测试 作为一位经历过手工测试、录制回放、脚本维护三个阶段的老测试工程师&#xff0c;我始终被一个问题困扰&#xff1a;测试用例的维护成本永远与业务复杂度成正比。直到…...

前端首屏性能指标(FP/FCP/LCP/TTI)测量全攻略

在前端开发中&#xff0c;首屏加载性能直接决定了用户的第一体验&#xff0c;而FP、FCP、LCP、TTI作为衡量首屏性能的核心指标&#xff0c;是面试和项目优化中绕不开的话题。很多开发者只知道指标的定义&#xff0c;却不清楚如何实际测量&#xff0c;本文将从开发调试、代码埋点…...