根号分治

  • 根号分治是一种思想,一般根据一个数(可以是数组的数,也可以是答案的数)分类,分为大于 s q r t ( n ) sqrt(n) sqrt(n)的部分和小于等于 s q r t ( n ) sqrt(n) sqrt(n)的部分

  • 题目链接: luogu.com.cn/problem/P3396

  • 解题思路: 根号分治的经典题目。我们根据模数分类,模数大于等于 s q r t ( n ) sqrt(n) sqrt(n)的部分我们暴力求解,小于等于的部分我们提前预处理出来就好了

const int N = 2e5 + 5;
int n , m , a[N];
int dp[N][405];
int main ()
{CLOSE;cin >> n >> m;for (int i = 1 ; i <= n ; i ++)cin >> a[i];int p = sqrt (n);for (int i = 1 ; i <= n ; i ++){for (int j = 1 ; j <= p ; j ++)dp[j][i%j] += a[i];}while (m --){string op;int x, y;cin >> op >> x >> y;if (op == "A"){if (x <= p) cout << dp[x][y] << endl;else{ll ans = 0;for (int j = y ; j <= n ; j += x)ans += a[j];cout << ans << endl;}}else{for (int j = 1 ; j <= p ; j ++)dp[j][x%j] += (y-a[x]);a[x] = y;}}
}
  • 题目链接: https://codeforces.com/problemset/problem/1446/D2
  • 解题思路: 本题与简单版本的差异在于出现数的种类,那么我们按每个数出现的次数根号分治,那么出现次数大于等于 s q r t ( n ) sqrt(n) sqrt(n)的数种类一定是不超过 s q r t ( n ) sqrt(n) sqrt(n)那么这一部分我们可以和 E e s y Eesy Eesy部分同样处理,接下来是出现次数小于等于 s q r t ( n ) sqrt(n) sqrt(n)的这一部分。显然我们也需要根据 s q r t ( n ) sqrt(n) sqrt(n)这个复杂度来。所以,我们枚举最终序列中最大出现次数为 x x x, x x x属于 [ 1 , s q r t ( n ) ] [1,sqrt(n)] [1,sqrt(n)]。接下来可以利用尺取得做法求出每个 x x x得最大值
const int N = 2e5 + 5;
int n , buck[N], a[N];
int mx, val, cnt;
int ans = 0;
unordered_map <int,int> ma;
void solve1 (int x)
{ma.clear();int v = 0;ma[0] = 0;for (int i = 1 ; i <= n ; i ++){if (a[i] == x) v ++;if (a[i] == val) v --;if (!ma.count(v))ma[v] = i;elseans = max (ans , i - ma[v]);}
}
void solve2 (int x)
{for (int i = 1 ; i <= n ; i ++) buck[i] = 0;int l = 1, type = 0;buck[a[l]] ++;if (buck[a[l]] == x) type ++;for (int i = 2 ; i <= n ; i ++){buck[a[i]] ++;if (buck[a[i]] == x) type ++;else if (buck[a[i]] > x){if (buck[a[i]] == x + 1) type --;while (buck[a[i]] > x){buck[a[l]] --;if (buck[a[l]] == x) type ++;else if (buck[a[l]] == x - 1) type --;l ++;}}if (type >= 2) ans = max (ans, i - l + 1);}
}
int main ()
{CLOSE;cin >> n;mx = 0, val = 0, cnt = 0;for (int i = 1 ; i <= n ; i ++) {cin >> a[i], buck[a[i]]++;if (buck[a[i]] > mx)mx = buck[a[i]], val = a[i], cnt = 1;else if (buck[a[i]] == mx)cnt ++;}if (cnt > 2){cout << n << endl;return 0;}int limit = sqrt (n);for (int i = 1 ; i <= n ; i ++)if (buck[i] >= limit && i != val)solve1 (i);for (int i = 1 ; i < limit ; i ++)solve2 (i);cout << ans << endl;
}

学习计划——根号分治相关推荐

  1. 第8期Datawhale组队学习计划

    第8期Datawhale组队学习计划马上就要开始啦 这次共组织15个组队学习,涵盖了AI领域从理论知识到动手实践的内容 按照下面给出的最完备学习路线分类,难度系数分为低.中.高三档,可以按照需要参加 ...

  2. 转发:Datawhale第七期组队学习计划

    编者注:Datawhale是一个公益组织,也是AiUnion的四个成员之一,所有学习计划是免费的. 第7期Datawhale组队学习计划 马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论 ...

  3. Datawhale 暑期组队学习计划

    Datawhale暑期组队学习计划 马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论知识到动手实践的内容 按照下面给出的最完备学习路线分类 难度系数分为低.中.高三档 可以按照需要参加 ...

  4. Open3d学习计划—高级篇 8(网格变形)

    Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...

  5. Open3d学习计划—高级篇 7(颜色映射)

    Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...

  6. Open3d学习计划—高级篇 6(体素化)

    Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...

  7. Open3d学习计划—高级篇 5(RGBD融合)

    Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...

  8. Open3d学习计划—高级篇 4(多视角点云配准)

    本文为转载文章,原创作者为blue同学,可关注他的博客:https://blog.csdn.net/io569417668 Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和 ...

  9. Open3d学习计划—高级篇 3(点云全局配准)

    Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...

最新文章

  1. 华为机考HJ7取近似值
  2. mysql的基本知识
  3. 下一次农业革命,微生物或为突破口
  4. Science Advances: 中科院微生物所叶健团队揭示双生病毒调控植物免疫平衡制约机制...
  5. Java的synchronized关键字:同步机制总结
  6. 学习的过程和挖矿其实很像
  7. [网络安全自学篇] 三.Burp Suite安装配置、Proxy基础用法及流量分析示例
  8. Leetcode 102. 二叉树的层次遍历
  9. Windows下gmssl使用记录
  10. Java中Comparable和Comparator接口的区别
  11. 贝塔斯曼龙宇:李斌能征善战 提前七年兑现了自己的承诺
  12. Uva 12657 Boxes in a Line 双向链表
  13. [渝粤教育] 西南科技大学 土力学基础工程 在线考试复习资料
  14. C++程序设计-第十周循环结构程序设计上机实践项目
  15. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_3 mybatis连接池的分类
  16. 软考网络工程师笔记-分值分布
  17. Springboot
  18. 项目管理课程体系——世纪德本PMCD品牌课程
  19. 【Vue】实现出生日期计算年龄
  20. 曾在国内外5家大厂做数据库工程师,这是他给出的5大数据库趋势预测

热门文章

  1. 操作系统-进程控制块PCB-实验报告
  2. 【Python】NumPy 的分位数实现 quantile() 是否出错
  3. sublime光标横竖线的切换(windows)
  4. docker 安装mysql8详细说明(复制命令即可跑起来)
  5. EOJ3298. 排队买夜宵 (using of stack<...>)
  6. Java 快速排序算法
  7. 流式计算之kafka Stream
  8. Docker部署java项目(Dockerfile方式)
  9. 人人开源前端代码cnpm install报错原因
  10. 王阳明:一次只做一件事的人,才会领先于这个世界