搜索
文章平均质量分 56
sophilex
kidlut
展开
-
一道有点仙的数位dp 方伯伯的商场之旅
为了防止越界,我们可以在一开始就判断一下,如果sum原创 2023-06-22 11:40:11 · 195 阅读 · 0 评论 -
数位dp训练笔记
依稀还记得去年寒假的时候对数位dp的恐惧达到了顶峰,打死也不想做一题,也是怎么学都学不会,甚至板子也只是真的去网上copy了一份,自己也都不理解。考虑dp状态dp[i][j][k]表示枚举到前i位,前i位数字的和是j,前i位组成的数字是k。g[i][j]表示当前枚举到第i位,出出现过的数码种类的状态为j的合法数字个数,也就是板子。f[i][j]表示当前枚举到第i位,出现过的数码种类的状态为j,也就是我们要求的答案数组。考虑枚举贡献,枚举二进制1的个数为j,假设有k个这样的数字,答案就是。原创 2023-06-04 10:03:13 · 244 阅读 · 0 评论 -
逆天思维题 CF741C
我们会发现,每一个点都被两种边连接,一个来自它的伴侣,一个来自它的其中一个相邻点,所以最后如果有环的话,一定是两种边交替出现的,所以不可能有奇环(一个特殊情况是情侣相邻坐,但不难发现此时也不是奇环)。有2n个人围成一圈坐在桌子边上,每个人占据一个位子,对应这2n个人是n对情侣,要求情侣不能吃同一种食物,并且桌子上相邻的三个人的食物必须有两个人是不同的,只有两种食物(1或者是2),问一种可行分配方式。因为只有两种颜色,所以是要我们构造一张二分图,其中情侣之间要连边,关键就是如何处理任意三个点之间的关系。原创 2023-04-06 21:40:29 · 306 阅读 · 0 评论 -
Educational Codeforces Round 143 (Rated for Div. 2) 题解
如果能向上走的话(父亲没有需要走的步数),就是将父亲的所需步数更新为该点所需步数-1.注意,一个父亲只能让一个儿子踩一遍,第二个儿子再过来就不能走了。hj原创 2023-02-21 21:34:24 · 575 阅读 · 0 评论 -
点分治学习笔记
有时候我们会碰到一些树上的路径问题,如果需要处理的规模很大的话,这时候点分治是一个很好的工具,往往可以在O(nlogn)的复杂度内完成操作,一般用于离线处理问题。原创 2023-02-03 12:21:57 · 332 阅读 · 0 评论 -
对抗搜索 学习笔记
我们限定一个利益区间【a,b】α Alpha is the maximum lower bound of possible solutions对于一个追求max利益的节点P,它的所有子节点都是追求min利益,会将收益尽可能降低,那么P就会在所有尽可能低的收益里选最高的,也就是α了。β Beta is the minimum upper bound of possible solutionsβ同理。是在所有尽可能高的收益里取低原创 2023-01-06 00:03:29 · 703 阅读 · 0 评论 -
AtCoder Beginner Contest 280 老年人复建赛
这里,如果A到B有两条路径,且一条的权值为a,另一条的权值为b的话,如果a!=b,那么会发生什么?这就意味着a-b不为0,所以这两条路径产生的环,从某一个方向走的话,总权值就是正的了,那么我们就可以一直走来刷分,那么结果就是inf,考虑到连通块上的其他点也能从环上任意一点到达,所以这整个连通块上的点的答案就都是inf了。如此我们得到一个结论:从A到B的答案不为inf当且仅当A到B的所有路径的总权值都是相等的,这就是说这里不存在dis更新的问题,因为能更新就意味着inf,这个我们可以在最后直接判掉。这原创 2022-12-04 09:53:43 · 536 阅读 · 0 评论 -
CF1336A Linova and Kingdom
看这里大意:有一个有 n 个点的树,以 1 为根,你可以选择 k 个节点,使得这 k 个节点到 1 节点的最短路径中经过的非选择的点最多。思路:简单树形dp我们肯定会优先最好的叶子结点,这个能保证中间路径最长,相同路径下选叶子节点比选非叶子节点一定是要优的。所以如果我们选了一个非叶子节点,代表它的所有儿子我们肯定都选过了,那么就得把对应的重复贡献减掉。这样一综合就得到了对应的公式:每一个点选上之后对答案的贡献应该是它的深度减去以它为根的子树的大小。这里要求每一个点的深度以及子.原创 2022-05-10 13:07:26 · 131 阅读 · 0 评论 -
树的直径(板子)
用树形dp来求贴个板子自己用~对应板子题#include<bits/stdc++.h>using namespace std;#define ll long longconst ll N=1e5+10;const ll mod=1e9+7;struct ty{ ll l,t,next;}edge[N<<1];ll cnt=0;ll head[N];ll f1[N],f2[N];ll n,a,b,c;void add(ll a,ll b,ll c)原创 2022-04-08 21:09:40 · 389 阅读 · 0 评论 -
dfs序板子+树状数组板子题 求和
求和大意:单点修改,子树查询;思路:dfs,将树掰成线性的;然后无脑树状数组即可水水更健康~#include<bits/stdc++.h>using namespace std;#define ll long long#define lowbit(x) x&(-x)const ll N=1e6+10;ll n,m,k;ll a,b,c;ll tr[N];ll mas[N];//初始权值 struct ty{ ll t,next;}e...原创 2022-03-31 21:46:06 · 369 阅读 · 0 评论 -
UCF Local Contest A Prickly Problem
大意:给定一个图(边权全部=1),求生成树个数(点数<=100)思路:生成树计数裸题。1.基尔霍夫矩阵套板子ll K[N][N];ll f(){ for(int i=1;i<=n-1;i++){ for(int j=i+1;j<=n-1;j++){ while(K[j][i]){//辗转相除 ll t=K[i][i]/K[j][i]; f...原创 2022-02-27 09:38:07 · 219 阅读 · 0 评论 -
求树的直径 模板
树的直径:树上最远两点的距离求直径方法:先在任意一点做dfs找到离它最远的一个点作为直径的其中一个端点再以这个端点再做一次dfs找到另一个端点。两个端点的距离就是树的直径。一般可能会需要求出每一个点关于两个端点的距离,那就在每次dfs时注意一下相关数组即可例题大意:给定一棵树,要求构造n-1条边,使得每两个点的距离唯一且尽可能大。求边权之和。思路:找到直径的两个端点,树上离每一个点最远的点一定是两个直径之一,遍历每一个点时取到两个端点的距离的最大值即可。#inc原创 2022-02-25 15:55:51 · 151 阅读 · 0 评论 -
AtCoder Beginner Contest 240 E - Ranges on Tree
abc 240 E大意:给你一棵树,已知根节点为1.令Si表示以节点i为根的子树每一个节点会有两个数l,r(l<=r),所有数的构建应当满足现在求一种构建方式,使所出现的数尽可能小。输出每一个点对应的l,r思路:对于每一个叶节点,要让总的数尽可能小,那么叶节点的l=r自然是最优的。我们一次dfs找出所有叶节点并计数,每一个叶节点的l,r就是它对应的计数编号。然后再来一次dfs从根往下递归,每一个根节点的l应该使它的所有叶节点的l的最小值,相应的,根节点的r就应该原创 2022-02-21 10:16:16 · 405 阅读 · 0 评论 -
字符串dfs 单词接龙
链接:登录—专业IT笔试面试备考平台_牛客网细节会有点多,不难发现我们既要考虑单词之间能否拼接,又要考虑拼接长度,而且对于每个局部可行的方案,我们还要看看它是不是全局最优解。可能性如此多,那就不难想到应该要去使用搜索,将复杂的情况交给机子,我们只负责判断。可以使用dfs,通过循环来讲问题简化。dfs应该需要两个变量,一个是当前”龙“的末尾的单词,它是负责与下一个进行拼接的,事实上我们无需在每次dfs时把当前所有拼接过的字符串都写出来,只要写最后一个就可以了。另外一个比较棘手的问题就是判断两个字符串能不原创 2021-11-22 11:03:13 · 357 阅读 · 0 评论 -
一题多解:并查集+贪心/二分图染色
题意是求不可避免的冲突的最小值,不难想到贪心。可以先用sort把影响值按降序排列,之后对于每一对冲突,能分就分,分不了了,这一对的影响值就是答案了。那么这题和我之前写过的食物链就是一个思路了,假设有监狱A和B,对于每一对罪犯a,b,a关进A,b关进B这种情况和a关进B,b关进A在逻辑上是自洽的。那么我们用并查集把两种情况都考虑到的话,就很简单了,中间有矛盾了就直接输出并结束程序,然后在循环外面输出0就可以了(无不可避免的矛盾)。原创 2021-11-21 14:58:56 · 226 阅读 · 0 评论 -
dfs 矩形RECT
首先要把思路转换一下,题目要求方法数,其实就是一个起点在边界上,然后终点也在边界上,然后让你求所有走过路线的种类数。其中,边界只能经过两次,一次是第一次剪的起点,另一次是剪的终点。又因为题目的数据范围比较小,所以我们还可以对边界上的点进行枚举,求出以它为起点的剪的方法数。因为是求经过路径的种类,我们需要遍历所有情况,可以用dfs,又因为经过每一个点的,从不同方向来的情况不一样,所以要回溯。原创 2021-11-21 12:35:35 · 348 阅读 · 0 评论 -
并查集/搜索 SCOI2010]游戏
考虑将所有的装备属性值看作点,每一个装备看作点与点之间的线,那么情况就是:对于每一条先线,只能在其端点上取其中一个点,然后要保证取的点是连续增大的,问最多能枚举到哪个点。应该注意到可能并不是所有点都是互相连在一起的,也就是说,有的点可能是跟其他所有点相互孤立的,所以,我们应当求出所有的连通块,在每一个连通块内部求出其能枚举到的最大的点然后把所有连通块的结果在最后连起来,找到最小的最大枚举不到的点,它-1就是答案了。原创 2021-11-19 19:53:23 · 2740 阅读 · 1 评论 -
有关01bfs的一些想法
01bfs,也就是说,对于遍历到的每一个点,有两种选择,0和1,可以是消耗的能量为0和消耗的能量不为0(1、2、3。。。都可以,只要存在),那么当我们遍历图来寻找最短路时,应该选择将消耗能量为0的方向放在队首,然后让有能量消耗的方向放在队尾(用双向队列),保证先遍历不消耗能量的方向,因为其与该点的距离相当于为0,这样就保证了队列取出顺序始终为距起点距离的升序。原创 2021-11-18 20:52:00 · 321 阅读 · 0 评论 -
优先队列+bfs why的吃鸡
与普通的dfs的区别就是,它的移动速度是不定的,所以我们不能使用单纯的queue,而可以使用优先队列,因为队列存在的意义,就是要让各个能走的点,以到起点的时间(不是距离,因为速度不定)升序依次处理,那么就应该使用优先队列,来保证队列输出的顺序,是以步数为标准的。原创 2021-11-17 19:15:08 · 135 阅读 · 0 评论 -
优先队列版bfs maze
这道题跟普通dfs的区别就在于,它是有一个传送门的,那么当然不能像普通dfs一样建立一个队列,然后无脑塞进去再拿出来,因为我们塞进去的可能是通过传送门到达的地方,而dfs建队列的原则是先进入队列的一定是离起点最近的,那么传送门所带来的距离的不确定性就让我们无法正常使用queue。但是再一想,我们关心的其实不是进入队列的顺序,因为它最终要影响的其实是出队的顺序,而出队的顺序,由该点距离起点的距离决定,既然如此,就可以建一个优先队列来存储,我们依然可以无脑塞进去,因为优先队列可以保证我们的距离始终有序。原创 2021-11-17 17:51:39 · 87 阅读 · 0 评论 -
基础dfs:点石成金
链接:登录—专业IT笔试面试备考平台_牛客网题目描述:发现题目数据不大,然后因为石子的顺序已定,而且对于每颗石子,我们都有点或不点的选择,所以我们可以进行dfs。那么dfs该怎么操作呢?先来确定搜索系数吧。肯定需要一个一个参数来结束循环,那就应该是枚举到的石子序号a,当a>n时结束循环。然后还应该有两个参数,分别代表财富和魔法值,那dfs就很简单了,因为对于每颗石子,只要再往下递归两种对应情况就好了,再用一个ans来实时更新最大收益。上代码:#includ...原创 2021-11-14 19:08:36 · 731 阅读 · 0 评论 -
连通块 dfs 模拟战役
题目:链接:登录—专业IT笔试面试备考平台_牛客网bfs版:#include<bits/stdc++.h>using namespace std;int m,se=0;char mas[10][110];bool vis[10][110]={0};int cnt1=0,cnt[500]={0},ans=0;int dir[][4]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,-1},{1,-1},{-1,1}};inline void bf原创 2021-11-11 20:51:05 · 90 阅读 · 0 评论