根号分治

前言

本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正

如论文中所说,根号算法——不仅是分块,根号分治利用的思想和分块像

似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种是通过分成

多块后在每块上打标记以实现快速区间修改,区间查询的一种算法。根号

分治与其思路相似,将原本若一次性解决时间复杂度很高的问题分块去解

决来降低整体的时间复杂度。

例题

以本题举例子哈希冲突

本题作为论文的第一道题目,是一道很好的练习题,注意,本体给出的

\(value[i]\) 是 \(i\) 在序列中出现的次数,不要把题读错了(一开始我就读错了)

我们首先阅读题目,发现,无论是 \(O(n^2)\) 预处理, \(O(1)\) 查询,还是在

查询时直接\(O(n^2)\)获取答案,都是 \(O(n^2)\) 的时间复杂度,我们考虑对

其进行优化,我们可以考虑将\(p\),也就是模数按根号分块处理

对于 \(p<=\sqrt{q}\) 我们直接 \(O(n\sqrt{n})\) 进行预处理,

	for(int i=1;i<=n;i++){
v=read();
val[i]=v;
}
size=sqrt(n);
for(int i=1;i<=n;i++){
for(int p=1;p<=size;p++){
ans[p][i%p]+=val[i];
}
}

\(ans[p][i]\) 表示在 \(%p\) 后值为 \(i\)的数的个数

对 \(p>\sqrt{q}\) 的情况,

我们直接暴力得出答案,暴力得到答案的时间复杂度为 \(O(\sqrt{n})\)

	int an=val[y];
for(int i=x+y;i<=n;i+=x){
an+=val[i];
}
cout<<an<<endl;

\(an=val[y]\) 是为了处理 \(y%x=y\) \((y<x)\) 的情况,为什么说我们暴力跳

答案时间复杂度是 \(O(\sqrt{n})\) 呢?我们当前的 \(p>\sqrt{n})\) 因为统

计答案时每一次要跳\(p\)个数,所以有贡献的数一定小于 \(\frac{n}
{p}\) 也就是 \(\sqrt{n}\) ,所以暴力得到答案的时间复杂度为 \(O(\sqrt{n})\)

每一次修改,我们只需要修改 \(p<=\sqrt{n}\) 的情况即可,时间复杂度也是 \(O(\sqrt{n})\)

	cin>>x>>y;
int l=y-val[x];
val[x]=y;
for(int p=1;p<=size;p++){
ans[p][x%p]+=l;
}

所以在本题,我们运用根号分治的想法,把时间复杂度由原本的\(O(n^2)\)

优化到了 \(O(n\sqrt{n})\) 从而解决本题。

莫名觉得根号分治挺像折半搜索

,推荐一道练习题CF444D DZY Loves Strings

还是很有难度的

代码

放一下全部代码吧

#include<iostream>
#include<string>
#include<string>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
const int maxn=3e5+10;
inline int read(){
int ret=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
ret=ret*10+(ch^'0');
ch=getchar();
}
return ret*f;
}
int val[maxn];
int n,m;
int p;
int ans[2000][2000];
int size;
char a;
signed main(){
// freopen("a.in","r",stdin);
n=read();
m=read();
int v;
for(int i=1;i<=n;i++){
v=read();
val[i]=v;//????????
}
size=sqrt(n);//????
for(int i=1;i<=n;i++){
for(int p=1;p<=size;p++){
ans[p][i%p]+=val[i];
}
}
int x,y;
while(m--){
cin>>a;
if(a=='A'){
x=read();
y=read();
if(x<=size){
cout<<ans[x][y]<<endl;
}
else{
int an=val[y];
for(int i=x+y;i<=n;i+=x){
an+=val[i];
}
cout<<an<<endl;
}
}
if(a=='C'){
cin>>x>>y;
int l=y-val[x];
val[x]=y;
for(int p=1;p<=size;p++){
ans[p][x%p]+=l;
}
}
}
return 0;
}

到这里本题解就结束了

完结撒花!!

题解 洛谷 P3396 【哈希冲突】(根号分治)的更多相关文章

  1. 洛谷P3396 哈希冲突 (分块)

    洛谷P3396 哈希冲突 题目背景 此题约为NOIP提高组Day2T2难度. 题目描述 众所周知,模数的hash会产生冲突.例如,如果模的数p=7,那么4和11便冲突了. B君对hash冲突很感兴趣. ...

  2. 洛谷 P3396 哈希冲突 解题报告

    P3396 哈希冲突 题目背景 此题约为NOIP提高组Day2T2难度. 题目描述 众所周知,模数的hash会产生冲突.例如,如果模的数p=7,那么4和11便冲突了. B君对hash冲突很感兴趣.他会 ...

  3. 洛谷P3396 哈希冲突(分块)

    传送门 题解在此,讲的蛮清楚的->这里 我就贴个代码 //minamoto #include<iostream> #include<cstdio> #include< ...

  4. 洛谷P3396 哈希冲突

    分块还真是应用广泛啊...... 题意:求 解:以n0.5为界. 当p小于n0.5的时候,直接用p²大小的数组储存答案. 预处理n1.5,修改n0.5. 当p大于n0.5的时候,直接按照定义计算,复杂 ...

  5. 洛谷P3396哈希冲突

    传送门啦 非常神奇的分块大法. 这个题一看数据范围,觉得不小,但是如果我们以 $ \sqrt(x) $ 为界限,数据范围就降到了 $ x < 400 $ 我们设数组 $ f[i][j] $ 表示 ...

  6. P 3396 哈希冲突 根号分治

    Link 据说这是一道论文题????.具体论文好像是 集训队论文<根号算法--不只是分块> 根号分治的裸题. 首先我们考虑暴力怎么打. 先预处理出每个模数的答案,之后再 O(1) 的回答, ...

  7. P3396 哈希冲突(思维+方块)

    题目 P3396 哈希冲突 做法 预处理模数\([1,\sqrt{n}]\)的内存池,\(O(n\sqrt{n})\) 查询模数在范围里则直接输出,否则模拟\(O(m\sqrt{n})\) 修改则遍历 ...

  8. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  9. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

随机推荐

  1. [Luogu P2014]选课 (树形DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2014 Solution 这是一道十分经典的树形DP题,这种类型的树形DP有一种很普遍的解法. 首先,观察 ...

  2. 我的 Redis 被入侵了

    好吧,我也做了回标题党,像我这么细心的同学,怎么可能让服务器被入侵呢? 其实是这样的,昨天我和一个朋友聊天,他说他自己有一台云服务器运行了 Redis 数据库,有一天突然发现数据库里的数据全没了,只剩 ...

  3. VC中句柄、指针、ID之间的转换

    win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量. 从句柄到指针 CWnd* pWnd ...

  4. 834. Sum of Distances in Tree —— weekly contest 84

    Sum of Distances in Tree An undirected, connected tree with N nodes labelled 0...N-1 and N-1 edges a ...

  5. leetcode114:valid-sudoku

    题目描述 根据数独的规则Sudoku Puzzles - The Rules.判断给出的局面是不是一个符合规则的数独局面 数独盘面可以被部分填写,空的位置用字符'.'.表示 这是一个部分填写的符合规则 ...

  6. 嗖嗖移动大厅 源代码 Java初级小项目

    今天给大家一个比较综合的项目:嗖嗖移动业务大厅.项目功能很多,概括的功能也很全面.吃透了这个项目,你的java基础部分已经非常棒了!!! 一 . 项目概述 技能要求  使用面向对象设计的思想  合 ...

  7. 测试:OGG初始化同步表,源端抽取进程scn<源端事务的start_scn时,这个变化是否会同步到目标库中?

    一.测试目标 疑问,OGG初始化同步表,源端抽取进程开始抽取的scn<源端事务的start_scn时,这个变化是否会同步到目标库中? 二.实验测试 如下进行测试! session 1 SQL&g ...

  8. 给你一条sql语句如何进行优化

    我们sql语句的书写是根据业务逻辑进行书写的,如果执行比较慢,那么我们对sql重写: 如分步查询,然后在代码层进行拼接:用临时表:改变sql语句的写法等等.我们称之为逻辑层优化. 然后我们看看每条sq ...

  9. mon的稳定性问题

    MON的稳定性问题: mon的选举风暴影响客户端IO LevelDB的暴涨 频繁的客户端请求的DDOS mon选举风暴: monmap会因为mon之间或者mon与客户端之间网络的影响或者消息传递的异常 ...

  10. JPA、Hibernate、Spring-Data-Jpa的本质区别

    什么是JPA? 全称Java Persistence API,可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们提供了: 1)ORM映射元数据:JPA支持 ...