zoukankan      html  css  js  c++  java
  • 省选前复习小记

    还有三天复习,而这只蒟蒻还在不知死活的颓废

    数据结构小记

    (KD)-(Tree)

    • 基础功能:
    • 领域查询(类似于启发式搜索,时间复杂度实际上没有保证)
    • 维护高维空间数点,(此处以(2)维为例),可以进行,矩阵/单点修改,矩阵/单点查询....(反正就是一颗平衡树)
    • 不是(leafy tree),每个点都代表实际上的一个节点和一个子空间,树高为(O(log n))
    • 建树的时候根据(x),(y)的方差哪个大,决定按哪一维排序,并且尽可能地选择中位数作为根,使得子树尽可能均匀来保证树高
    • 如果要求支持动态插入删除的话,采用替罪羊树的暴力重构法,设一个阈值(alpha)
    if(max(siz[lc[u]],siz[rc[u]])) >= alpha * siz[u]
    then rebuild(u)
    
    • (alpha)可以取值(0.725)
    • 练习:[国家集训队]JZPFAR((checkmark))
    • 本来是玄学复杂度的估价函数,然后因为保证数据随机就对了(大雾)
    • 最小值的估价函数
    double F(int a,int b){/*a到b区域欧式距离的估价*/
    	double res = 0;	
    	if(t[a].x < L[b])		res += (L[b] - t[a].x) * (L[b] - t[a].x);
    	if(t[a].x > R[b])		res += (R[b] - t[a].x) * (R[b] - t[a].x);
    	if(t[a].y < D[b])		res += (D[b] - t[a].y) * (D[b] - t[a].y);
    	if(t[a].y > U[b])		res += (U[b] - t[a].y) * (U[b] - t[a].y);
    	return res;
    }
    
    • 最大值的估价函数
    ll f(int a,int b){
    	ll ret = 0;
    	ret += max(s(t[a].x - L[b]),s(t[a].x - R[b]));
    	ret += max(s(t[a].y - D[b]),s(t[a].y - U[b]));
    	return ret;
    }
    
    • 需要注意一点,(KD)-(Tree)在建树后的点的下标会改变,如果需要用到原来的下标,需要提前标记

    (splay,LCT)

    (kruskal)重构树,笛卡尔树,可并堆(左偏树)

    • 之所以把这几个归在一起是因为我都不太熟悉,貌似都和最值有关
    • (kruskal)重构树常用来解决瓶颈点瓶颈路相关问题
    • 瓶颈边的做法大家应该都很熟悉,按权值从小到大排序的合并建出来的是大根堆,反之是小根堆,这样的一棵树一共有(n + m)个点,叶子代表点,非叶节点代表边
    • 这里讲一下瓶颈点的做法,按(jiangly)鸽鸽的话来说一点差别都没有(不过我可不这么觉得),其实就是按点权从小到大排序,然后向外连边,假设当前点是(x),我们只连((x,y) in E && v_x ge v_y)的边,我们直接连(y)所在的并查集(可以理解为重构树的一个子树)所代表的根,并把它们合并起来
    • 应用则是比较单一的,主要是利用了一个性质,此处以大根堆瓶颈边为例,若你当前在(x),则你能通过权值不超过v的边到达的点都在你重构树中最上面的权值(leq v)的祖先的子树中
    • 笛卡尔树则主要和最值分治以及一些性质题有关
    • 重点复习左偏树

    线段树分治,整体二分,树套树,(cdq)分治

    线性基,(bitset)

    • 线性基基础操作就不说了
    • 静态区间线性基
    • 维护前缀线性基,然后同时维护一个时间,在插入的时候尽可能使时间最大即可,具体地,在遍历到某一位时,我们保留时间较大的那一个,并把时间小的往下传
    • (k)小值
    • 如果要求(k)小值,我们可以让线性基的每一位互不影响,具体表现为,如果第(i)位线性基有值,那么我们就将其他第(i)位线性基上有值的数异或掉这一位,只要从大到小操作即可
    void rebuild(){
        for (int i=60;i>=0;i--)
            for (int j=i-1;j>=0;j--)
                if (d[i]&(1LL<<j))
                    d[i]^=d[j];
        for (int i=0;i<=60;i++)
            if (d[i])
                p[cnt++]=d[i];
    }
    long long kthquery(long long k){
        int ret=0;
        if (k>=(1LL<<cnt))
            return -1;
        for (int i=60;i>=0;i--)
            if (k&(1LL<<i))
                ret^=p[i];
        return ret;
    }
    

    可持久化数据结构

    线段树进阶操作

    贪心(dp)小记

    斜率优化注意点

    dp凸优化

    • CF125E MST Company((checkmark))
    • 一个细节问题,凸包中有可能有若干个点斜率相同,以下凸壳为例那么我们需要保证在解最优的前提下,横坐标尽可能小,这样就可以保证答案是一定是当前点或在当前的点的右边,意味着要增大斜率这样可以方便二分
    • 初始斜率的(l,r)要赋到上界

    决策单调性

    贪心模拟费用流

    *保序回归和拟阵

    计算几何学习

    杂项

    闵可夫斯基凸包和(包含极角排序和凸包)

    	for(int i = 1; i <= n; ++i){
    		if(p[i].x < p[1].x || (p[i].x == p[1].x && p[i].y < p[1].y)){
    			swap(p[i],p[1]);
    		}
    	}
    
    • 选择(x)最小的点

    *半平面交

    *最小圆覆盖

    • 模板最小圆覆盖((checkmark))
    • 随机增量法的运用,设当前圆为(C),每次添加一个点(p_i),有以下事实
    • 新的最小覆盖圆是
    • (if(p_i in C) C)
    • (otherwise) (C cup {p})
    	for(int i = 1; i <= n; ++i){
    		if(!in(p[i],C)){
    			C = Cir(p[i],0);
    			for(int j = 1; j <= i - 1; ++j){
    				if(!in(p[j],C)){
    					C = Cir((p[i] + p[j]) * 0.5,0.5 * (p[i] - p[j]).dist());
    					for(int k = 1; k <= j - 1; ++k){
    						if(!in(p[k],C)){
    							C = calc(p[i],p[j],p[k]);/*求外接圆*/ 
    						}
    					}
    				}
    			}
    		}
    	}
    

    网络流/二分图

    (Dilworth theorm)

    • 偏序集的最小不可重链覆盖等于最长反链

    一些对偶结论

    • 二分图的最小点覆盖 = 最大匹配 = 总点数 - 最大独立集
    • 二分图最小顶标和等于最大带权匹配

    (DAG)最小链覆盖

    • 若不可重,拆点二分图:将一个点拆为出点和入点,若原图中有边,则从对应出点连向对应入点,最小链覆盖即为总点数-最大匹配
    • 若可重,(floyd)传递闭包,转化成不可重问题

    (Hall theorm)

    二分图匹配

    • 可以利用匈牙利算法
    • 注意其本质是一个贪心的不停找增广路的过程
    • 利用这一性质,我们可以解决这样一个问题,在满足最大匹配的前提下,能否令(x,y) 匹配
    • 我们随意跑一个匹配,若(match[y] = x)显然可以,否则我们强行令(match[y]:=x),把(x,y)从二分图中删掉,然后令原来的(match[y])重新跑一遍增广路(注意此时(y)已经不存在了),若其仍然能跑出增广路,则可以
    • 更加一般地,我们可以直接把((x,y))删掉然后继续规划,从而在保证最大匹配的前提下尽可能匹配我们想要的
    • (example:)求二分图(保证有完美匹配)的字典序最小匹配

    最小割

    • 最小割的可行边与必须边
    • 不妨考虑边((x,y))
    • 首先跑一遍最大流
    • 可行边:该边满流且两端点在残量网络中不属于同一个强连通分量((scc))
    • 很好理解,注意若满流则残量网络存在反向边((y,x)),若(x,y)在一个(scc)内则意味着(x)还能到(y)那么就白割了
    • 必须边:满流且(x与S)在同一个(scc)内且(y)(T)在一个(scc)
    • 证明是平凡的,若不割,(S->x->y->T),矛盾
    • 最小割模型构建网络流一些常用模型的建构

    费用流

    上下界网络流

    • 无源汇上下界可行流
    • 我们先强制每条边都流了下界,然后把上界减下界作为流量,计算每个点的流入量-流出量,记为(M),若(M < 0),则连向汇点,否则连向源点
    • 计算每条(S)出发的边是否满流即可
    • 有源汇上下界可行流
    • (T)(S)(inf)的边即转化成上面的问题
    • 有源汇上下界最大流/最小流
    • 有源汇上下界最小费用可行流
    • 模板|AHOI2014支线剧情((checkmark))

    字符串

    (kmp)(border)

    (pam)(manacher)

    (AC)自动机

    (sam)和广义(sam)

    数论

    同余理论复习

    积性函数筛法

    迪利克雷卷积与莫比乌斯反演

    组合数学及数学杂项

    • (复习为主)

    容斥原理

    各种反演

    斯特林数

    • 第一二类斯特林数公式及组合意义

    卡特兰数

    生成函数

    (prufer)序列

    多项式(要打模板)

    图论/树论

    矩阵树定理

    链分治,点分治,点分树,边分治

    长链剖分,树上启发式合并

    (tarjan),圆方树,(2 - SAT)

    欧拉回路/竞赛图

    差分约束

    杂项

    博弈论

  • 相关阅读:
    Android图像格式类及图像转换方法
    Java实现文件的加密与解密
    Google最新截屏案例详解
    Android应用程序模拟手机按键
    Android浮动小球与开机自启动
    Android手机截屏
    Android图片浏览器之图片删除
    Android图片浏览器之缩略图
    MFC实现Gif动画制作工具
    QRadioButton分组且无边框的简单实现
  • 原文地址:https://www.cnblogs.com/y-dove/p/14621248.html
Copyright © 2011-2022 走看看