- 博客(114)
- 收藏
- 关注
原创 BZOJ 4736: 温暖会指引我们前行(LCT)
题目分析动态维护一颗最大生成树,注意查询的值不是用来做最大生成树的那个权值。具体就是把边变成点。一些查找要素都可以放在splay中查找。还有就是要注意如果有一条边不选的话,那么我们可能不会为它建立结点,所以要特判一下修改的时候它是不是出现了,出现了就不管。代码#include<cmath>#include<queue>#include<...
2018-04-11 16:54:46
372
原创 BZOJ 3489: A simple rmq problem
我以前可能写了个假的KD-Tree,关键是还过了这么多题。。。题目大意题目链接 给出一个长度为n的序列,给出M个询问:在[l,r]之间只出现过一次的数的最大值。要求在线,找不到输出0.分析确定了一个上一次出现和下一次出现的位置之后,就是在一个三元组内查询最值,那么就上KD-Tree即可。代码#include<cmath>#include<que...
2018-04-10 20:42:03
257
原创 板子:可持久化数据结构
可持久化线段树基本思想一种牺牲一点空间来达到更多操作的数据结构,似乎可以部分代替平衡树,并且是个在线的过程。至于更多的细节打算以后去拜读cls的大作吧,先把基本的弄了来。思想就是单点修改只需要修改一部分的点,共用一部分的点,然后用来作各种各样的操作,区间修改也是可以的,但是要稍作改动。还有就是那个所谓主席树就是指以下标为时间的权值可持久化线段树。至于觉得可持久化线段树很鸡肋...
2018-04-09 22:50:39
288
原创 学习笔记:并查集
并查集这是一个可以实现合并与查找(元素间关系判定)用来维护多集合(功能多样化)的超牛批的可以动态维护的树形结构。个人理解:这个算法只要是实现集合元素关系的类型都可以用到,又是线性时间复杂度,而且最关键的是它是个高级数据结构,翻译过来就是这个可以动态维护,所以我觉得这个用途比单纯的算法要好,实际应用比较大,而且这个方法可能不是唯一的,但是用这个方法可以做很多题,比如二分图中用到动态维...
2018-04-09 22:37:34
233
原创 板子:离散对数、BSGS及其算法
离散对数求最小的r使得a^r=b(mod p)成立如果在没有p的时候,r=log(a,b),是个对数因为有mod,所以叫做离散对数。如何求离散对数第一种方法是暴力找r,不多讲了。下面的方法不怎么讲证明,只管照着步骤弄就行了,以后补证明吧。BSGSBaby step Giant step,中文名叫做大步小步法,和它的过程很有关联。如果P是素数:因为如果...
2018-04-09 22:36:37
821
原创 Codeforces 613D(虚树)
题目大意链接 给定一棵树,每次给定一些点,求最少要阻断多少点使得这些点之间两两之间无法通行。其中不能阻断给定点,无解输出-1.分析虚树上贪心/DP即可。虚树由于在树上有可能有很多点根本就不需要用,所以我们要把这些点提出来单独组成一棵树,减少了大量运算。一般来说我们要提出的点是所有的点和这些点之间两两LCA的点,然而K个点LCA的点仅仅有K-1个,也就是按照DFS序排序...
2018-04-09 17:27:54
447
原创 板子:线性基
简述线性相关:可以通过一些元素异或出集合中其它元素。线性基的一些性质: - 线性基内所有元素线性无关 - 对于原集合任意元素异或的值域和线性基任意元素异或的值域相同 - 线性基的个数就是二进制下位的个数 - 线性基a[i]如果存在,则满足第i位是1,且前面的位都是0 不用太在意如何求出的线性基 一些操作最大值查询可以询问当前元素,只需要把ret改成当前元素即可最...
2018-04-08 23:17:50
343
原创 板子:欧拉函数
欧拉函数欧拉函数的值fi(n)=1~n中和n互素的数个数其中fi(1)=1p为素数时,fi(p)=p-1一般计算方法(用容斥推来)fi(i)=i * ( ( p1-1)/p1) * …*(pn-1/pn),pi为i的质因数欧拉函数线性筛原理: 积性函数假设素数p是n的质因数,那么 - 如果p还能整除n/p, phi(n) = phi(n/p)*p - ...
2018-04-08 23:16:03
340
原创 板子:高斯消元
原理简述大概就是模拟手工消元吧用法大概还是推了公式然后消元吧,其中比较特别的有matrixTree定理还有线性基。行列式求法对于一个矩阵进行高斯消元最终案为(-1)^S*(主对角线之积),其中S位行与行之间交换的次数matrixTree定理用于一张图的生成树计数问题理论基于基尔霍夫(Kirchhoff)矩阵,但是这里不去证明了: 介绍两个矩阵: ...
2018-04-08 23:13:23
883
原创 BZOJ 2160: 拉拉队排练(马拉车)
[原题链接(https://www.lydsy.com/JudgeOnline/problem.php?id=2160)分析马拉车板子。代码#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=2e6+105,mod=19930726;int n;LL ...
2018-04-08 21:33:00
226
原创 BZOJ 2120: 数颜色(带修莫队)
题目给定一个序列要求查询一个区间不同颜色的个数,支持修改操作。带修莫队记一个看起来很SB时间复杂度O(n5/3)O(n5/3)O(n^{5/3})连暴力都是O(n2)O(n2)O(n^2)但是有些时候可以代替树套树而且空间非常小而且超好些的高科技算法带修莫队:修改按时间排序查询按左端点的块为第一关键字,右端点的块位第二关键字,时间为第三关键字,每次查询暴力修改、转移。...
2018-04-08 20:02:29
352
原创 学习笔记:插头DP(BZOJ2331: [SCOI2011]地板)
膜了一波WXH天犇的代码,woc,惊为天人,代码还能这么写的!?插头DP插头DP的状压是要把整行的插头情况全部状压进去,所以说插头DP也是状压DP的一种(不要尝试不压缩) 插头DP大多逐格递推,当前格仅需要上一格递推,所以可以滚动。 插头DP是插在边上的插头,不是点上,因此有m个下插头以及一个右插头,注意空间。插头DP的关键在于确定插头的种类(包括没有插头),很多时候会超过2种...
2018-04-08 18:32:21
320
原创 板子:后缀数组
简介把字符串的后缀提出来,然后按照字典序排序,sa[i]表示排名为i的后缀这样可以利用单调性等快速做很多操作。操作重要数组:SA和heightST表:用于O(1)查询两个后缀的最长公共前缀常见操作技巧分组:对于每一个height值几个巧妙的题目不重叠:直接判断后缀的值就好了,通常会分组。不相同子串个数:子串总数-height之和,证明就是把每个后...
2018-04-08 12:28:28
220
原创 板子:trie以及权值线段树查找异或
分类简述一般的trie并没有什么特别的,可以O(n)进行字符串匹配。二进制trie这不是做字符串匹配的,而是查找最大异或和,从高位贪心即可,高位不够补0可持久化trie单纯的给trie加个可持久化权值线段树二进制trie注意: - 充分理解在高层结点决策的思想,因为边才是权值。 - 直接一位对一位,调位置太麻烦了。 - 注意那个bool运算...
2018-04-08 12:27:56
266
原创 板子:KMP、AC自动机、trie图、fail树
前言KMP是一个经典的字符串匹配算法。然后AC自动机是基于KMP思想的一个多模板匹配算法。trie图是AC自动机的一个优化。fail树是AC自动机中fail指针构成的有特殊性质的树。KMP算法算法原理设两个字符串长度为n和m。两个模板匹配,如果暴力匹配是暴力枚举起点,最坏时间复杂度O(n * m * min(n,m) )利用一个叫做失配指针的东西,f[i...
2018-04-08 12:26:35
365
原创 板子:马拉车算法、回文树
两个处理回文串的利器。马拉车可以求出每个字符为中心的最长回文串。回文树可以统计本质不同的回文串数量以及每个回文串的个数,以下标i结尾的回文串个数。马拉车原理首先在第一个位置插入一个’$’防止溢出,然后再所有字符之间插入’#’来处理奇偶回文串的问题。大概原理就是如过当前回文串最右端包括了当前区间,那么就可以通过对称点得到一个初始值,如果不在初始值就为1。然后暴力匹...
2018-04-08 12:25:48
389
原创 不打代码系列
SCOI2015Day1解题过程T1:BZOJ4445: [Scoi2015]小凸想跑步*不能在同一行或者同一列 可二分+网络流建模: 把行、点、列都看做点 1、源点连接所有行流量为1 2、每行连接所有该行权值为0的点,流量为1 3、所有权值为0的点连接对应列,流量为1。 4、所有列对应点连接汇点,流量为1 最后检验最大流是否>KT2:BZOJ4...
2018-04-08 12:03:12
233
原创 3924: [Zjoi2015]幻想乡战略游戏(点分树)
题目链接分析点分树裸题!!!其实是不想写题解大概就是要新建立点分树,基本上是一个新树了。要维护以每个结点为根的子树信息来辅助查询。查询的时候就是找子树中比当前结点优的点然后。这里跳到那个结点的根结点去。还有就是会被菊花卡成O(n)的查询,但是这题有限制子树不超过20个。代码#include<bits/stdc++.h>//注意距离都要开LL ...
2018-04-03 23:23:18
335
原创 BZOJ 4828: [Hnoi2017]大佬(状态搜索)
题目大意挺多操作的,自己看 原题链接分析首先求出最大怼大佬的天数,因为补血和攻击操作是没有关系的,所以可以DP求出最多怼大佬多少天。然后关于F和T的关系处理是很巧妙地,爆搜!!,爆搜出来状态数并不多,处理出来所有可能的值以及所需要的天数然后用一个他们叫tow-pointer的神秘算法。。。其实就是两个指针因为不能让大佬的自信为负数,所以要保证两次直接怼的操作不能让,就...
2018-03-29 11:21:01
245
原创 BZOJ 3774: 最优选择(最小割建模的一般方法)
题目大意给定一个矩阵,选择每个元素的代价是aij,如果一个元素被选择了或者上下左右四个元素被选择了,会获得收益bij,要求最大化收益-花费分析想不到我也能自己做出最小割啦哈哈哈首先这道题基本上可以确定使用最小割,第一步就是要把收益累加起来,然后看会用多少花费或者损失多少收益。然后我们要分析出一个重要的性质就是,一个点的收益,要么选择这个点,要么选择周围一个点,要么都不选,肯...
2018-03-28 22:50:55
490
原创 莫比乌斯反演:跟着Po大爷的讲稿刷题
2301: [HAOI2011]Problem b#include<bits/stdc++.h>using namespace std;const int maxn=50000+105,N=50000;int mu[maxn],sum[maxn],p[maxn],sz;bool isp[maxn];void ready(){ sz=0; sum[1]...
2018-03-28 16:09:38
229
原创 BZOJ 4827: [Hnoi2017]礼物(循环卷积)
题目大意给定等长一个序列一个环,环可以从任意地方断开形成一个序列,可以把一个序列的值加上c,要求序列各个元素差的平方的和。分析推一推就可以直接把c的最优值求出来,可能是我常数比较大的缘故,三分都要超时 把一个序列反转,就变成了循环卷积的形式。要注意四舍五入的方法:用round这个自带的四舍五入函数(floor)(x+0.5)不要用(int)(x+0.5),在x是负数的...
2018-03-28 13:17:59
280
原创 板子:LCT(现在都不敢说自己写的是学习笔记了)
以后Splay就只记LCT的,其他的用treap 简述LCT的大概思想是这样的:每一条重链都是一颗Splay,其中深度为键值(要把握住它是一条连,而且键值不会重复)同一重链结点之间的连边是通过Splay内部连边完成的轻边是通过Splay的根结点的父亲连接,但是该父亲不会指向该根结点(著名的儿子认父亲,父亲不认儿子问题)(Splay的根结点的父亲是Splay在原树中顶端结...
2018-03-27 21:53:41
813
原创 BZOJ 4571: [Scoi2016]美味(权值线段树查询最大异或和)
题目大意给定一个序列a1~an 给定若干个询问, b , x , L , R 最大化b xor (ai+x)|L<=i<=R分析不考虑x这个偏移量我们用二进制trie现在考虑了有一个新操作就是权值线段树把ai全部丢到权值线段树里面假设我们所有的数二进制长度不超过5假设我们贪心地选择了待选择的ai的前两位是10(之前选择的时候我们可以保证有这样的a存在...
2018-03-26 15:34:57
191
原创 板子:计算几何
#include<cmath>#include<queue>#include<cstdio>#include<cctype>#include<vector>#include<cstring>#include<iostream>#include<algorithm>usin
2018-03-24 16:45:31
1142
原创 板子:卢卡斯定理
卢卡斯算法原理用于求大组合数c(n,m)%mod=C(n%mod,m%mod)*C(n/mod,m/mod)%mod代码递归版LL fac[mod+105],inv[mod+105];void getInv(){ fac[0]=fac[1]=inv[1]=1; for(int i=2;i<mod;i++) { ...
2018-03-23 22:50:43
750
原创 板子:中国剩余定理(CRT)及扩展中国剩余定理
中国剩余定理简述主要是用在很多算法的扩展上面,如果mo数不是素数,那么很多算法会失效,所以就把它分解质因数然后按照中国剩余定理合并即可。本人现在不打算管证明,只需要有结论。算法过程设余数为c[i],模数为m[i],令M为m[i]之和 那么最终答案就是c[i](M/m[i]) inv((M/m[i]),m[i])之和modM 解是唯一的,而且由于每个mod都m个不同...
2018-03-23 20:20:15
731
原创 【cqoi】2017省选凑数记
我就是去凑人数的哈哈哈~~~Day 0 (17.4.7)这次看考场又把物理化学课落下了,应该要补起来,这是小事,考试地点在南山邮电大学,和一个高二的大神,以及我们三个高一陪跑的,也恰好见见题型,积累每一次的经验,这时候恰好是樱花开的季节,南山的樱花本就有些出名因为到的时间还早,到处去找樱花,却只是找到了路边的几排,和想象中是大相径庭的。但是看花本就无所谓,内心想的,是对这次考试的憧憬。...
2018-03-23 15:51:34
682
1
原创 逆元的求法总结(3种基本方法+4种实现)
简述逆元逆元(Inverse element)就是在mod意义下,不能直接除以一个数,而要乘以它的逆元。 比如a∗b≡1(modp)a∗b≡1(modp)a*b≡1 (mod p),那么a,b互为模n意义下的逆元,比如你要算x/a,就可以改成x*b%p观察a∗b≡1(modp)a∗b≡1(modp)a*b≡1 (mod p),变形为a∗b+k∗p=1a∗b+k∗p=1a*b + k*p ...
2018-03-23 15:49:12
67872
10
原创 BZOJ 4031: [HEOI2015]小Z的房间(生成树计数)
题目生成树计数(这么总结题意真的好嘛。。。)分析Matrix Tree定理裸题 而Matrix Tree定理就是用来生成树计数的 行列式的求法: 对于一个矩阵进行高斯消元 最终案为(-1)^S*(主对角线之积),其中S位行与行之间交换的次数Matrix-Tree定理:用于计算生成树计数问题 理论基于基尔霍夫(Kirchhoff)矩阵,但是这里不去证明了: 介绍两个矩阵:...
2018-03-22 21:20:04
221
原创 BZOJ 3503: [Cqoi2014]和谐矩阵(高斯消元)
题目给定一个矩形,要求你去填上0/1,其中每个格子周围4个格子+自己的1的个数位偶数,求一个方案数,不能全为0,有SPJ。分析暴力算法是一个裸的高斯消元,把每个元素都列出来,而且可以过。进阶版的就是知道第一排元素之后,可以递推出后面的所有元素,如果m+1排元素为0,那么就是可行解。把所有自由元弄成1可以防止出现全0的情况。递推的时候可以用状压。找可行解的方法是先算出...
2018-03-22 15:43:58
168
原创 BZOJ 2115: [Wc2011] Xor (线性基+生成树)
题意给定一张无向图,求1->n的路径边权最大异或和。分析首先跑一颗任意生成树出来(DFS即可) 然后对于所有非树边,都形成一个环,我们叫它基本环。 通过异或的性质我们发现答案是选取一些基本环异或1~n在树上的路径异或和 所以我们把所有的基本环加入线性基,然后用1~n的路径去匹配贪心找最大值 基本环的寻找实际上结合在DFS中,用异或的性质可以算长度(不要去找LCA)...
2018-03-22 11:20:37
166
原创 BZOJ 1565: [NOI2009]植物大战僵尸(最大权闭合子图+拓扑排序)(最大权闭合子图介绍)
题目有一个N*M的方格,每个格子有一个权值,每个格子可以保护制定格子以及它后面的格子,只有当一个格子没有被保护的格子的时候才能被获取,求最大权值(原权值有正负)。分析最大权闭合子图的裸题。然而最大权闭合子图是啥?概念闭合子图:选取一些结点使得这些结点所有出边都不会指向当前结点们之外的边。最大权闭合子图:选取权值和最大的它的应用就比如说大学选课,需要先修课...
2018-03-21 23:44:48
163
原创 学习笔记:扩展欧几里得算法(持续更新)
欧几里得算法著名的辗转相除法,用于求a,b的最大公因数(greatest common divisor) 代码如下:LL gcd(LL a,LL b){ return !b?a:gcd(b,a%b);}时间复杂度:是按照斐波那契数列增长的,但是可以看作O(logn),且实际情况更好扩展欧几里得算法由裴蜀定理可知:ax+by=gcd(a,b)ax+by=gc...
2018-03-21 19:40:34
257
原创 BZOJ 2668: [cqoi2012]交换棋子(费用流)
题目有一个棋盘,有一些棋子,要求把这些棋子通过和周围的八连块交换,每个格子有交换的次数限制,求从初始状态移动到目标状态的最小交换次数,无解输出-1。分析有几个坑点: - 是八连块 - 交换的时候起点格子和终点格子都只交换一次,而其它格子交换两次我们把点拆成三个点,其中对于一般的路径用最后一个点连接第一个点。 源点连中间那个店,汇点也连接中间那个点。 点与点之间边连接成inf...
2018-03-20 23:37:50
198
原创 BZOJ:3894: 文理分科(网络流)
题目每个同学都只能选择文科或者理科一种,选择文科会获得一个权值,理科也有,如果一个人以及周围四个人都选择了一个学科,那么又会获得一个权值。 将权值最大化。分析很经典的网络流题目,用最小割。 首先我们的模型想法是把最终和S集联通的弄成文集,T集联通的弄成理集,然后用最小割割掉,为了使用最小割,我们采取首先加入所有权值,然后看根据选择减少了哪些权值。连边的方式就是: 对于一个...
2018-03-20 21:36:44
519
原创 BZOJ:2726: [SDOI2012]任务安排(斜率优化)
题目你有n个任务和一台机器,第i个任务完成时间是s[i],带来的费用是它的完成时间*费用系数f[i]。 每次启动机器需要时间S,可以将几个任务分成一组,这样只需要启动一次机器,但是所有任务的完成时间都将被计算为最后一个任务完成的时间。 注意计算等待时间!!! 现在你需要使费用最小。 时间可以为负数 0 < N<=300000 0<=S<=2^8 -(2^8)&...
2018-03-20 19:00:57
214
原创 BZOJ2756: [SCOI2012]奇怪的游戏(网络流)(还差代码)
题目原题链接 给定一个N*M的网格,每次操作可以选取相邻两个格子的元素把值+1,求最少操作次数使得所有元素的值相同。分析一个很常见的技巧,黑白染色。 在知道答案之后通过网络流建模满流来简单地判断是否可行。(黑格子进,白格子出) 在知道答案之前通过黑格子白格子的个数直接推导出是否有解,但是不满足二分性质的情况恰好都可以推出解来。代码回头补充...
2018-03-19 20:41:56
177
原创 BZOJ1010: [HNOI2008]玩具装箱toy(斜率优化以及斜率优化套路)
题目将n个元素进行分组,每个元素都有一个权值w[i],每组的元素必须是一段连续的元素,将i~j 这一组组带来的费用是(∑jk=iw[k]−L)2(∑k=ijw[k]−L)2(\sum_{k=i}^jw[k]-L)^2,求最小费用分析老子终于写了一道斜率优化啦!!!!先说一下斜率优化的一般步骤: 1. 推出DP方程,大概是f[i=min{f[j]+g(i,j)}的形式,max也...
2018-03-19 19:36:01
152
原创 板子:素数的判定以及整数的唯一分解定理
素数判定方法一:定义判定法bool isp(int n){ if(n<2)//0,1 不是素数 return 0; int m=sqrt(n+0.5); for(int i=2;i<=m;i++) if(n%i==0) return 0; return 1;} 性能分析 ...
2018-03-18 21:54:38
1009
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人