- 博客(23)
- 收藏
- 关注
原创 第一周训练
/注意到对称的关系,当不相等时交换有效,对于i-1,如果存在贡献就切断,同时swap,将这个swap的影响给到i+1,因为当i和i+1同时调换时,相当于原本的关系。如果没有理解错题意的旋转,就不会被硬控8h,导致上头没有做后面的系统题;//注意到l,r可以,那么l+1,r也可以这个事实;//这个思路挺巧妙,考虑结果的规律,然后进行筛选,注意哈希冲突。//注意到只需要主对角线,记录主对角线的最小值即可。//两遍dfs,第一遍预处理,第二遍计算结果。//贪心求出能选i就选i,线性处理即可。
2024-10-28 00:33:35 805
原创 并查集专题
用途:除以上三类外,并查集:二分,背包,线段树分治,线段树合并;简而言之,并查集只是维护信息的手段,需要合并类的信息,一般使用并查集;扩展域可以判断二分图:不能有奇数环,原理是:A->B+n->C,如果下一步A和C相连,A与C都是属于同一个集合,此时形成奇环;并查集:普通并查集维护一类信息;扩展域并查集维护两类信息;
2024-10-19 19:08:23 177
原创 树状数组专题
整体二分+树状数组:本质上说是利用分治来解决问题,树状数组用来维护贡献;一般流程为根据答案分流:询问+信息。树状数组:动态前缀和,维护前i个点的贡献(可以维护信息线段树一类)
2024-10-19 16:46:55 277
原创 CF背包DP
思路:我们考虑题目三的转化,s1+s2+s3=3*n,看出s1+s2-2*n+s3-n=0,即s1+s2-n=x;思路:为了区分n1以及n2,我们考虑dp[n1][n2][2]代表,i个步兵,j个骑兵,结尾为01(步兵骑兵)的方案数;思路:我们考虑那么一个状态dp[i][j]表示第i个价格,在前j个物品的最大价值。思路:这个实际上是贪心+dp,我们考虑击杀k个恶魔,法力值剩余最大,因为法力值上限只和击杀恶魔数量有关。转移方程为:dp[i][j][1]+=dp[i][j-k][1];
2024-10-06 23:46:13 386
原创 最小费用流+CF线性DP
思路:定义dp[x][y]表示三元组[i-1,i,i+1]的个数,以及三元组[i,i+1,i+2]的个数.为什么不选择i-2,i-1,i呢,实际上这个会被i-1为中心而被包围。思路:货物搬运,显然的是, 多的会分给少的,其中相邻的点的费用为1,所以首先连边。思路:定义f[26][26]表示状态i字母开头,j字母结尾的最大长度,最后统计f[i][i],注意为0的情况,显然是不成立的。思路:哈希线性判断回文串,使用dp[j][i]+=dp[j][i-1]+当前以i结尾的贡献。
2024-09-30 23:38:02 308
原创 CF补题第二天
思路:实际上对于最大值,他一定是有某个数作为分割点,我们考虑二分这个数,如果这个数上面的res>k那么这个数一定小了,所以l=mid+1;总结:思路看起来很简单,但是我自己想却需要想1h左右,这是打CF的第30天,分数现在为1278,下一个月再接再励,先上1600。思路:第一眼SPFA,结果直接超时,正解思路:每一条边只走一次,那么我们找出不同的连通块,然后拓扑排序求最短路(因为无环),拓扑排序时对于每个连通块内部跑dij。剩下的就是跑树而已;思路:预处理左右最短时间,枚举每个点,暴力check。
2024-09-28 21:38:41 447
原创 CF补题第一天
思路:首先我们考虑暴力求解,显然会超时;那么如何快速求小于等于mid的数的个数,我们知道小于等于mid的数一定是a%x<=mid;不妨我们跑dij时,同时维护当前是否有马的信息,我们知道当处理到当前的点时,如果没被使用,那么一定是最优解,因为优先队列维护的最小值。那么我们考虑如何快速维护长度为k的一个数组最多的数的个数。思路:首先知道每个点最多只有用一匹马,否则一定不是最优解;思路:抓住连续这个特点,将每个数加上n-i;那么位置相对的数就相等;思路:就是简单的求next数组,找到这个字符串最长的后缀数组;
2024-09-26 23:33:27 322
原创 CF973div2 B-E题解
一.B题目链接:https://codeforces.com/contest/2013/problem/B我先考虑一个简单的问题:对于a1 a2 a3,他的答案是什么呢?考虑a2最后被合并,先合并a1,那么a2=a2-a1,再合并a3,a3=a3-a2+a1;考虑a1最后被合并先合并a3,a3=a3-a2,再合并a1,a3=a3-a2-a1;很显然第一种方式更大。现在扩展问题,先考虑加一个数a4;a3最后被合并,那么式子为a4=a4-([1,3]的合并最小),a4=a4-a3+a
2024-09-24 12:42:36 677 1
原创 第34次认证货物调度+dinic最小割
不妨我们回顾一下,最大流:S->T的最大流量flow(通过增广路来实现),那么我们可以知道不存在大于flow的流量,又是增广路,那么必然是因为某些边满流导致不存在增广路。假设存在更小的权值f,那么将f的边容量设置为0,那么一定不存在增广路。状态dp[i][j]为价值为j的最小费用。再改进一下,转换状态方程状态dp[i][j]表示前i组的费用为j的最大利润。正解思路:对于每一个物品而言,可能对答案产生贡献的一定是,这个物品的价值>取出物品的费用c;按组贪心的按照物品的利润排序,因为同一组的物品的费用都一样。
2024-09-20 15:30:57 426
原创 codeforces 971div4
可以知道,对于i来说,check(i)的大小会逐渐上升,负数到正数;那么很显然我们可以二分答案,找到第一个ans>=0的i,那么答案必然在i和i-1中产生;很显然我们可以使用容斥定理解决这个事情,对于质数2,1-n中,个数为多少呢?很显然先求出包含1个2的数有多少个(n/2);再求出包含两个2的数有多少个(n/2/2),递推即可。考虑那么一个问题,两倍长度的数组可以代表全部的循环数组,那么我们对于l和r检查他们的数组,最后在加上(len-len1-len2)/n的全部数组大小。注意开LL,否则RE;
2024-09-12 19:04:47 315
原创 最大流之多源汇点,关键边
下面给出一个O(n^2*m)的做法,对于一条边,我们扩大容量,是否有增广路。首先我们先跑一遍dinic求残余网络。然后对于每一条容量为0的边u->v(>0的边一定没有增广路了),查看从源点S是否能到u,和从v是否能到T;如果条件满足,那就存在增广路;多个源点,不就是这几个源点的流量是不守恒的吗,我们直接建立超级源点和汇点,跑dinic即可。因为多个源汇点的流始终是单向的,我们只需要提供一个起始点和承接点即可。无非就是增加一条边,然后是否有增广路的情况;
2024-09-12 17:35:13 548
原创 网络流之容量限制
也就是说当我们构建出可行流后,以s点开始跑dinic,一定不会影响到S和T的边权的,那么S和T的边权始终是满流状态(也就是说,我们从s点开始跑dinic,最终的图对应到原图还是一个可行流),于是我们可跑dinic,从而求出s->t的最大流,注意到s和t是循环的,所以我们需要断掉他们其中的一条边,并且记下边权res;我们可以知道的一点是,源点和汇点的边权和tot是一样的,当汇点和源点的边权全部流满时,才会对应于原图的可行流(因为我们需要满足补偿),所以我们采用dinic求最大流,看最大流是否为tot。
2024-09-11 16:49:27 870
原创 树形DP做题回顾(上)
我们可以知道对于u的儿子而言,我们求出了dp[v],那么如何从dp[v]转移到dp[u]中呢,如何转移是最优解呢?一开始以为是网络流的问题,但是仔细一看,这个转移的条件很弱,可以看到求出u的ans,可以推出v的ans转移方程f[v]=f[v]+min(w,f[u]-min(w,f[v]));对于这个问题,很快速的我们可以想到跑两次dfs,第一次预处理出以u为根的子树的第一,二深的深度,第二次dfs进行树形dp,从u->v时推出v的最大深度,用up[v]来存储;代码如下:注意1号节点也需要玩农场,需要特判。
2024-09-10 21:28:36 646
原创 虚树+树形dp
虚树实际上是一颗浓缩子树;使用虚树的题目大部分具有查询的点有限,同时虚树构建的信息符合规则;做虚树的题目:步骤为先想出原树的暴力求解做法,然后构建虚树同时向其中添加有用信息(比如边权);虚树的构建过程:虚树的构建大致有两种,但是两种方式都与dfs序有关;首先解释为什么与dfs序有关我们可以知道,虚树的构建是求各个关键点两两的lca的过程。如果是两两求lca,暴力构建虚树的话,复杂度会达到k*k*logn;dfs序的出现可以将复杂度降为klogn;
2024-09-10 10:50:35 947
原创 最大流之二分图
因为假设我们在两边建立源点与汇点,那么我们可以把匈牙利算法的过程抽象为,每次寻找一条增广路。下面给出dinc求最大流,我们建立两个虚点为源点和汇点,直接套用模板即可。总结:对于匈牙利算法而言,实际上对应为最大流中的EK算法;实际上二分图的最大流应用,重点在于建图和源点与汇点。后面有学习到新的点再做添加。
2024-09-08 22:26:16 357
原创 基本数论下
这里我只对为什么通解是lcm(a1,a2)做解释,这是由于x同余m1(mod a1),那么也就是说求出了x的特解后,通解加上的数必然是a1的倍数,其次对于x同余m2(mod a2);实际上对于任何(0,0)->(n-1,n+1)的路径path我们可以知道,一定存在某一时path一定穿过红线,那么记下这个时刻点,这样我们一定可以跟这个时刻点,后面path的方式,唱“反调”,当其到达(n-1,n+1)时,我们到达(n,n);容斥原理的要点为:质数筛,通过+1,-1,+1,-1来实现不重不漏的求解。
2024-09-08 11:26:18 786
原创 基本数论(上)
那么m的欧拉函数应该为p1*p1*p2*p3*(1-1/p1)*(1-1/p2)*(1-1/p3),转化一下就变为p1*p1(1-1/p1)*p2*(1-1/p2)*p3*(1-1/p3),实际上就是m=p1*(m/p1的欧拉函数);优化:我们可以知道我们一定是重复筛除了一些数,事实上我们可以这么做,当我们循环到i时,筛除小于i的质数的i倍的数,但是这样好像没有优化,不妨我们考虑一下,一个数可以被分解为多个质数相乘,那么当i为某个质数z的时候倍数时,那么任何质数的i倍必然会被z筛除。所以m不被y所筛出。
2024-09-03 20:44:43 611
原创 线性基专题
也就是对于n个数的数列而言,我们有cnt个线性基,那么这cnt个线性基可以表示数列间的任意乘积,那么我们从n个数中取出构成线性基的cnt个元素(上述证明的对应关系),那么还剩下n-cnt个元素,可以构成。-1,那么这个集合肯定从线性基中取了某个数设为f[i],假设这个线性基在这个集合中只出现奇数次,那么集合的异或值中,i处的异或值必然为1,但是由于线性基中没有了f[i]这个数,于是无法解决这个集合的异或值中i的位置出现1的情况;首先线性基的个数必然和数列中的数有关,对于线性基中某个数,例如f[i]!
2024-08-28 15:21:36 708
原创 数位DP与状态压缩DP专题
思路:预处理出横向的合法状态,我这里采用的是处理所有通用的合法状态(即没有考虑地图),最后在dp过程中考虑纵向和地图的影响;你也可以处理出符合地图的所有横向状态,用vector来存储每个横向的合法状态,最后在dp过程中考虑纵向状态即可。直接按照树形结构进行求解,这里需要注意的是0-最高位1的数,比如对于7654321来说,我们需要特别的处理0-999999之间的数。将数存储起来,由大到小进行遍历,状态表示为:选当前的数和不选当前的数;其次进行dp,dp中需要对合法的纵向状态进行筛选,最后进行状态转移;
2024-08-27 17:05:34 384
原创 CF968 (Div. 2)D1和D2题解
再进行状态更新,可能这时候会有所疑惑:当我们跳到某个g[i]后,如果我们还可以从g[i]处继续跳,那么不会重复利用到跳过的l吗,实际上是不会的,如果说我们重复利用了某个集合,那么我们从g[i]开始的话,那么必然会用到f[x]<g[i],同时f[x]出现过,那么f[x]可达的最大距离就是g[i],这一点与我们距离会变大相矛盾,因此不会出现重复利用;下面考虑最大的g[i],由于可以枚举多次,对于最大的(f[i],g[i])对,我们不妨考虑 0<=j<=m,此时当j!当j=f[i]时,他可以直接跳;
2024-08-26 17:03:21 558
原创 区间dp与树形dp专题学习心得
i,j]这个区间涂抹上p的颜色,这时候注意到[l,i-1]和[j+1,r]的颜色是不变的,根据前面的假设可以知道,这两个区间的颜色都是一样的,于是对于[i,j]区间来说,答案为。信息为:最小删除次数,我们维护[l,r]的最小次数,枚举分割点l
2024-08-25 13:37:35 469
原创 CF2002E题解
思路:观察特点可以看到ans是非递减的,同时给出模拟的想法:对于前i个数对,每次取出最小的ai的数对,对于前i个数,全部都更新一遍,同时维护取出ai数对位置两边的合并信息,上述操作执行i次得到结果,发现复杂度为。1.处理第i个数对时,假设我们处理出i-1数对的合并信息,当我们需要使用i-1数对的合并信息时,第i个数对必须突破第i-1的数对,这里的突破可以为合并或者删除;对于无法突破时:更新i-1的合并信息,添加{ai,bi}到i-1的合并信息中;4.初始时,对于a1,第0个数对的合并信息为空;
2024-08-14 19:32:43 208
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人