首页 > 其他分享 >分治

分治

时间:2024-07-12 11:19:33浏览次数:9  
标签:return 基准值 int 分治 mid msort 排序

快速排序

每次找一个基准值,比基准值小的放左边,比基准值大的放右边,在分别对左右排序
标准代码:

void work(int l,int r)
{
	if (l >= r) return;
	int mid = (l+r)/2;
	mid = a[mid];
	int x = l,y = r;
	while (x <= y)
	{
		while (a[x] < mid) x++;
		while (a[y] > mid) y--;
		if (x <= y) swap(a[x++],a[y--]);
	}
	work(l,y);
	work(x,r);
}

求第k小

只需要枚举第k小所在的区间即可将复杂度将为O(n)

三分

广泛用于单峰函数求最值,因为三个点就可以确定区间

函数

给定n个二次函数,求max(f1(x),f2(x),……,fn(x))在1~1000,中最小值
直接二分x,去出最大值即可
注意掉精度哦

归并排序

先从中间分,把两边排好后再合并

void merge(int l,int r)
{
	int x = l,y = (l+r)/2+1;
	int p = l;
	while (x <= (l+r)/2 && y <= r)
	{
		if (a[x] <= a[y]) b[p++] = a[x++];
		else b[p++] = a[y++];
	}
	while (x <= (l+r)/2) b[p++] = a[x++];
	while (y <= r) b[p++] = a[y++];
	for (int i = l;i <= r;i++) a[i] = b[i];
}
void msort(int l,int r)
{
	if (l >= r) return;
	int mid = (l+r)/2;
	msort(l,mid);
	msort(mid+1,r);
	merge(l,r);
}

逆序对

如果只要后一半与前一半有后面小于前面的答案加加(cnt += m-x+1)

平面最近点对

先算出两边的最小距离d
在以中间的点为中心找出所有距离小于等于d的点
在暴力枚举所有可能

标签:return,基准值,int,分治,mid,msort,排序
From: https://www.cnblogs.com/xxsap/p/18297941

相关文章

  • 线段树分治学习笔记
    线段树分治是一种通过线段树维护时间轴,实现一些可撤销的信息维护问题的手段。线段树分治是离线算法。具体地,对于若干个修改与询问,按照时间戳像区间修改一样挂在线段树的节点上,然后遍历整棵线段树,将节点上的操作计入贡献,对于一个时间戳为\(t\)的询问,线段树上区间\([t,t]\)即......
  • cdq分治
    cdq分治其大致形式为递归左右半边考虑左半边对右半边的影响二维偏序(归并排序):计算数对\((i,j)\)满足\(a_i<a_j\)并且\(b_i<b_j\)的数对数量先以\(a_i\)排序,这样条件被转换为\(i<j\)且\(b_i<b_j\)考虑cdq分治先递归左右半边对左右两边各开一个指针,若\(b_i<b_......
  • Day 2 - 分治与倍增
    分治的延伸应用应用场景优化合并假设将两个规模\(\frac{n}{2}\)的信息合并为\(n\)的时间复杂度为\(f(n)\),用主定理分析时间复杂度\(T(n)=2\timesT(\frac{n}{2})+f(n)\)。能直观的看出优化程度还是很大的。归并排序中\(f(n)=O(n)\),则\(T(n)=O(n\logn)\)。......
  • 递归 | 分治
    这两个算法有部分重合,所以一起讲。递归\(\sf\small\color{gray}Recursion\)递归是递归函数的灵活运用。说到底,它是一个\(\color{blue}\texttt{C++}\)的一个语言特性。在函数内部调用函数,会使得思路更加清晰明了。观察生活,很多事情随着规模或阶段的上升而变得越来越复杂。......
  • 读人工智能全传03分治策略
    1. 黄金年代1.1. 图灵在他发表的论文《计算机器与智能》中介绍了图灵测试,为人工智能学科迈出第一步做出了重大贡献1.2. 美国在第二次世界大战后几十年里计算机技术发展的特色,也是美国在未来60年内确立人工智能领域国际领先地位的核心1.3. 1955年,麦卡锡向洛克菲勒研究所撰......
  • CF1039D You Are Given a Tree (树形 dp + 贪心 + 根号分治)
    CF1039DYouAreGivenaTree树形dp+贪心+根号分治题目是一个经典问题,可以用树形dp和贪心解决。设\(f_u\)表示以\(u\)节点为端点能够剩下的最长路径。考虑从叶子节点往上合并贪心,那么如果能够合并出包含\(u\)节点的大于等于\(k\)的路径,那么就合并,\(f_u=0\);否......
  • 动态DP&动态树分治
    引入——最大权独立集问题:最大权独立集:对于一棵树,求出一个点集,这个点集里面的任意两个点都不相连。那么在所有这样的点集中,点权和最大的那个点集,就被成为最大权独立集。想要求出最大权独立集的点权和,我们只需要使用树上dp的方法即可实现设数组f[N][2]其中f[x][0]表示不选择......
  • C140 线段树分治+01Trie P4585 [FJOI2015] 火星商店问题
    视频链接:   C09【模板】可持久化字典树(Trie)-董晓-博客园(cnblogs.com)P4585[FJOI2015]火星商店问题-洛谷|计算机科学教育新生态(luogu.com.cn)//线段树分治O(nlognlogn)#include<iostream>#include<cstring>#include<algorithm>#include<vect......
  • [暴力 Trick] 根号分治
    根号分治PS:本篇博客题目分析及内容(除代码)均来自于paulzrm根号分治,是暴力美学的集大成体现。与其说是一种算法,我们不如称它为一个常用的trick。首先,我们引入一道入门题目CF1207FRemainderProblem:给你一个长度为$5\times10^5$的序列,初值为$0$,你要完成$q$次操作,操作有如......
  • 无根树分治的三种常见方法
    无根树分治一般常见于树上路径问题(计数,最优化等).常见题目如无权树树上距离为k(对1到n-1求)的路径数量.点分黑白且可以改,求两端都是黑点的最远路径.以我的理解,三种分治都是无法互相平替的,对于每种分治我尝试给出一道只能用这个分治的题目.三种分治复杂度均为logn*T(n).......