09 2024 档案
摘要:dp 真是又爱又恨,当你推出式子来非常开心,但当你毫无思路时又无可奈何。
阅读全文
摘要:P3355 骑士共存问题 我还没学网络流所以先讲二分图的做法,讲述下思路怎么推出来的。 可以发现骑士可达的点的颜色总是与自己的颜色相反,放了这个骑士,周围可达的方格就不能放骑士,要求客房的最多骑士数量,发现这与二分图最大匹配是相同的,所以直接进行分点匹配。 #include <bits/stdc++
阅读全文
摘要:很显然看到要求最大值最小就可以想到二分答案,然后依次判断长度是否合法。 这题的输出比较特殊越靠前的区间长度越小,所以我们要将最后得到的答案从后向前依次划分区间即可。 #include <bits/stdc++.h> #define ll long long using namespace std;
阅读全文
摘要:欧几里得算法 欧几里得算法又称辗转相除法,用来求两个数的最大公约数的算法。 省流:\(gcd(a,b)=gcd(b,a\mod b)\) 学习笔记 点击查看代码 #include <bits/stdc++.h> using namespace std; int a,b; int gcd(int x,
阅读全文
摘要:学习笔记 学习笔记 逆元 当 \(ax\equiv1\ (mod \ b)\) 称 \(x\) 为 \(a \mod b\) 的逆元,记作 \(a^{-1}\)。 求逆元 以下都是求逆元的方法,为了不那么无聊 给个例题做。 拓展欧几里得法 exgcd链接 虽然 exgcd 是为了求 \(ax+by=
阅读全文
摘要:小费马定理: 如果 \(p\) 是一个素数,且 \(a\) 是任意整数,则: \[a^p \equiv a \ (\text{mod} \ p) \]当 \(a\) 与 \(p\) 互质时,即 \(\gcd(a, p) = 1\), 则有:$$a^{p-1} \equiv 1 \ (\text{mo
阅读全文
摘要:其实三分和二分实现是一样的,但是为什么我还要写一下呢,因为我没学的时候感觉太可怕了,学了后发现也就那样,所以我要记录一下(水题解)。 原题链接 每次三分取 \(x\) 判断大小。 #include <bits/stdc++.h> using namespace std; #define ll lon
阅读全文
摘要:裴蜀定理 \(i|j\) 表示 \(i\) 是 \(j\) 的约数。 \(ax+by=c\),\(x,y\in \mathbb{Z}\),该等式成立的条件为 \(gcd(a,b)|c\)。 省流: \[ax+by=gcd(a,b) \]接下来证明一下: 设 \(s\) 为 \(gcd(a,b)\),
阅读全文
摘要:欧拉函数 定理 欧拉函数,即 \(\varphi(n)\),表示的是小于等于 \(n\) 和 \(n\) 互质的数的个数,详细定义看wiki。 欧拉函数其实就是容斥原理的应用,举个例子: 如 \(n=6\),\(1,2,3,4,5,6\) 是整个序列,我们将 \(6\) 的质因子 \(2\),\(3
阅读全文
摘要:一个正向取前缀和,一个反向取,最后枚举断点。 #include <bits/stdc++.h> using namespace std; #define ll long long int n,sum; int a[200005]; int front[200005]; int back[200005
阅读全文
摘要:又是一个思维毒瘤好题,但dp题都是这样,菜就多练吧。 拆环为链,前缀和加速计算,枚举断点数、起点、终点、断点。 #include <bits/stdc++.h> using namespace std; #define ll long long const int N=105; int a[N*2]
阅读全文
摘要:原题链接 虽然我还是看题解才会做的(菜),但我还要说这题挺简单的(菜),还是菜就多练。 因为是对一个字符串操作求树的可能数,所以考虑区间dp,设状态 \(dp[i][j]\) 为区间 \(i\) 到 \(j\) 树的状态数。 在转移的过程中如果 \(s_i=s_j\) 时代表这可能为同一个根节点组成
阅读全文
摘要:学习笔记 因为这题总是涉及相邻位,所以在计算的时候要多计算几个。 #include<bits/stdc++.h> using namespace std; #define ll long long int n,m; ll dp[15][15]; int a[15]; void init(){ for
阅读全文
摘要:纯纯数位dp板子,可以顺着思路下来。 传统技能学习笔记 不要62 libreoj 设状态为 \(dp[i][j]\) 为第 \(i\) 位是 \(j\) 的可能情况数。 枚举位数,这位的数,低一位的数,将每一位的组合可能存下来,但要把这位是 4 与这位是 6 低一位是 2 的情况排除掉。 void
阅读全文
摘要:存下输赢代价,计算时先减为平局,判断输赢,如果还是输,那继续加一变为胜利这局,判断输赢。 #include <bits/stdc++.h> using namespace std; #define ll long long const int N=1e6+10; int n; int a[N]; i
阅读全文
摘要:非常丰富害怕的一天,第一次打csp-s,感觉有点害怕的,但是考前心态还挺好的。 11.10分出发,1点到达,吃了个午餐(馄饨!),然后再等待,拍了几张照后就进去了,考试楼挺近,但为什么一层就4个考场,然后进场,入座观察,靠窗开心,桌子有点高不太开心,花了10分钟左右做完选择,程序阅读有点傻眼,做了一
阅读全文
摘要:自从钻研这换根DP,犹如梁山好汉破了难关。初时只觉这树状结构,分枝繁复,变化多端,哪知竟有此等妙计。每换一根,便能高效算出新解,岂不似宋江指挥众兄弟,调度得当,事半功倍。更妙的是,这容斥之法,恰如兵法计策,分而治之,避开冗余。学之愈深,愈觉精妙,心中豪气顿生,恨不得与众学者痛饮一场,论此技之神通。
阅读全文
摘要:大佬题解 感觉分层图的做法太nb了吧,每次向下连边更新权值,我确实没什么补充的了,还是看大佬的吧。 #include <bits/stdc++.h> using namespace std; #define ll long long const int N=1e7+10; int n,m; int
阅读全文
摘要:根据题意可知,如果第 \(i\) 只生物是天使那么 \(a_i\) 生物就是恶魔,如果第 \(i\) 只生物是恶魔那么 \(a_i\) 生物就是天使,这时我们就发现这与二分图染色法相同,关于二分图染色法可以看这里。 样例一如下图: 因为这题要求出恶魔数量最多的方案,所以每次选择颜色最多的那个颜色加到
阅读全文
摘要:P1330 封锁阳光大学 用二分图的构造方式即可,找到两种颜色最小值加起来,注意:图不连通。 #include <bits/stdc++.h> using namespace std; int n,m; int color[10005]; int vis[10005]; int p=0; int x
阅读全文
摘要:原题链接 好讲解 好代码 匈牙利算法,每次匹配抛弃原有,选择新有。 #include <bits/stdc++.h> using namespace std; int n,m,c; int v[505][505]; int ask[505]; int matched[505]; int ans; i
阅读全文
摘要:前言 其实 01bfs 就是用队列维护的最短路,在权值只有 \(0\) 和 \(1\) 时就可以把权值为 \(0\) 的方案放到队列最前,权值为 \(1\) 的则放到最后,然后进行搜索,保证高效和正确性。 P4554 小明的游戏 模板题。 大部分 bfs 题都可以用最短路做,而最短路中 dijkst
阅读全文
摘要:双倍经验:P2024 [NOI2001] 食物链 当问题要求维护一些对立的关系时(朋友、敌人),就可以用种类并查集实现。 因为有三种关系所以并查集的数组要开三倍空间,第一倍空间存同类关系,第二倍存捕食关系,第三倍存被捕食关系。 注意:一的猎物的猎物就是一的天敌,其他就可以直接并查集维护即可。 注意这
阅读全文
摘要:P4568 [JLOI2011] 飞行路线 考虑跑多层图,每层图连条边权为0的边,跑 dijkstra 即可。 #include <bits/stdc++.h> using namespace std; #define ll long long const int N=1e7+10; int n,m
阅读全文
摘要:类似最小生成树,对边排序依次加上,但是数据大,要进行离线处理,存起来,将比他小的边加上,判断连通用并查集(路径压缩,按秩合并)。 唐完的我在赛时没写按秩,而且while没写终止条件(唐老鸭)。 先按秩后合并,测评机有点玄学但确实要这样。 初版: #include<bits/stdc++.h> usi
阅读全文
摘要:P1892 [BOI2003] 团伙 种类并查集!!!! 存敌人 主要要理解敌人的敌人就是朋友这句话,我们就可以用并查集来维护朋友,用一个数组来储存他的其中一个敌人,后面遇到其他他的敌人时,将他的敌人用并查集连起来成为朋友。 注意这题要你输出团队数而不是团队的人数不会就我这么唐吧。 #include
阅读全文
摘要:四倍经验 51nod 2875 单词游戏 acwing 1185. 单词游戏 洛谷 SPOJ WORDS1 - Play on Words 单词 Play on Words 题意 将 \(n\) 个单词,问能否把这些单词首尾相接的连起来(头尾字母要一样)。 分析 我们可以将每一个字母看成一个节点,这
阅读全文
摘要:51nod 1720 祖玛 这又是一个区间 dp,但这题又和其他的不一样,这题又用记忆化搜索,但是多学一种方法也没事,但其实用搜索后就模拟即可了。 #include<bits/stdc++.h> using namespace std; // 定义全局变量 int n; // 数组长度 int dp
阅读全文
摘要:51nod 3180 矩阵连乘 感觉区间 dp 还是要感性理解,但好像区间有套路的,这和石子合并很像,就根据题意模拟。 这个写法的区间比较巧妙,左右同时增加,相当于滑动窗口,因为一开始花费一个是0,所以注意dp的初始化。 #include<bits/stdc++.h> using namespace
阅读全文
摘要:P1775 石子合并(弱化版) 感觉 dp 太难了,这真的感觉太难学了,但是还要写题记积累啊,唉! 感觉不用讲题意了(那你也别讲题解了)就是石子之间可以合并,合并的代价是这堆石子数,问如何合并全部石子后总代价最小。 考虑用区间 dp,设状态为 \(dp[i][j]\) 为区间 \([i,j]\) 的
阅读全文
摘要:模板题 我写不明白我要用其他人的学习笔记 这个 其实也没法写,真要一步步写很复杂。 无非就是依次将每个数减掉系数,最后成为一个单位矩阵。 所以看注释: #include<bits/stdc++.h> using namespace std; #define ll long long const in
阅读全文
摘要:学习笔记 最大M子段和 V1 \(N\) 个整数组成的序列 \(a[1],a[2],a[3],…,a[n]\),将这N个数划分为互不相交的 \(M\) 个子段,并且这 \(M\) 个子段的和是最大的。如果 \(M >= N\) 个数中正数的个数,那么输出所有正数的和。\(N,M<=5000\)。 例
阅读全文
摘要:51nod 1254 最大子段和 V2 #include <bits/stdc++.h> using namespace std; #define ll long long int n; ll a[50005]; ll sum[50005]; ll lmax[50005],rmax[50005];
阅读全文
摘要:51nod 1051 最大子矩阵和 可以用前缀和容斥优化到 \(O(n^4)\),但是不够进行如下图操作: 将每一列的数值都压缩到一维的数组上,就转换为求最大字段和问题,时间复杂度 \(O(n^3)\)。 看看代码就知道了。 #include <bits/stdc++.h> using namesp
阅读全文
摘要:51nod 1243 排船的问题 求最长绳子最短,考虑二分答案,判断时我们优先向左放,看是否能全放下。 #include <bits/stdc++.h> using namespace std; #define ll long long int n,x,m; int pos[50005]; int
阅读全文
摘要:51nod 1020 逆序排列 学习笔记 其实要预处理,但唐的我非要每次都求一遍。 设状态为 \(dp[i][j]\) 选了 i 个数逆序对数为 j 的排序种类数。 首先初始化 \(dp[i][0]=1\) 即没有逆序对,转移方程 \(dp[i][j]=dp[i-1][j]+dp[i-1][j-1]
阅读全文
摘要:题目链接 学习链接 设状态 \(dp[i][j]\) 表示整数 \([1,i]\) 满足要求的排列中,最后一个数选 \(j\) 的排列数。 开一个数组记录他的状态: 把前面已选好的序列中大于等于 \(j\) 的数都加一后再把 \(j\) 加到后面。 #include <bits/stdc++.h>
阅读全文
摘要:51nod 1050 循环数组最大子段和 虽然是板子题,两种做法,我们先写一种,另一个咕咕。 因为是循环,所以分为两种,中间的和两边的,中间的直接dp求最大,两边的转化一下就是总的数字和减去中间的最小数字和。 #include <bits/stdc++.h> using namespace std;
阅读全文
摘要:1202 子序列个数 设 \(dp[i]\) 为第i个数不同子序列个数,先不考虑重复的情况,每个数只有选不选,转移方程为 \(dp[i]=dp[i-1]\times 2\),但现在我们要求的是不同的子序列个数,因此要减去重复的子序列个数。对于选取了 \(a_i\) 的子序列,会出现重复的序列一定是以
阅读全文
摘要:因为边权递增,按最小生成树的顺序 dp,设状态 \(dp[i]\) 为 \(i\) 点的最长路径长度,但是需要单调递增,所以考虑可以同时更新(先将原dp数组储存下来,再用新数组的值更新原 dp 数组),答案为 \(max(dp[i])\)。 #include<bits/stdc++.h> using
阅读全文
摘要:3188 字符王国 建图,有环输出-1,无环按照拓扑序dp,设状态为 \(dp[i][j]\) 第 \(i\) 个点,\(j\) 的字符的出现的最大次数,最后遍历每个点找到最大答案。 #include<bits/stdc++.h> using namespace std; #define ll lo
阅读全文
摘要:51nod 1791 原题链接 因为在括号串固定的情况下,括号的匹配是固定不变的。所以对左括号进行匹配,p[i]表示与i这个括号相匹配的括号的位置,易得到dp方程 ans[i]=ans[p[i]+1]+1,然后再从后先前一遍求和即可。 #include<bits/stdc++.h> using na
阅读全文
摘要:51nod 1201 整数划分 设状态 \(dp[i][j]\) 为和为 \(i\) 时,选择的最大值为 \(j\) 的方案数,所以有转移方程 \(dp[i][j]=dp[i-j][j-1]+dp[i][j-1]\) 有点坑,先枚举 \(j\) 后枚举 \(i\)。 复杂度为 \(O(n^2)\)。
阅读全文
摘要:可以发现步数限制把数轴变为了环。环之间不可以交换,环内相邻两点可以交换,然后我们只需要对每个环操作,最后累加。 对于环上的每个石子堆,我们需要将其石子数调整到均值 \(avg\)。因此,我们首先计算每个堆石子相对于 \(avg\) 的偏差,即 \(nowa[i] - avg\)。 因为相邻节点不一定
阅读全文
摘要:其他学习笔记 这题真是凝聚了很多精华,那么我们就介绍这题的四兄弟: 大哥 平均数 这道题是其他兄弟的基础。 二哥 Best Cow 这位更是重量级,因为没特长只能强大哥的外貌,会大哥即识二哥。 三哥 PROSJEK 这位哥看似有点创新却仍没逃过一家子的基因,只是变为了小数运算。 四哥 寻找段落 作为
阅读全文
摘要:前置 博客学习 \(P(A∩B)\) 表示事件 \(𝐴\) 和事件 \(𝐵\) 同时发生的概率 条件概率: 条件概率是指事件 \(A\) 在另外一个事件 \(B\) 已经发生条件下的发生概率。条件概率表示为:\(P(A|B)\),读作“在B的条件下A的概率”。——《百度百科》 条件概率: \[P
阅读全文
摘要:51nod 3145 扔球游戏 终于听懂了一个期望题。 第 \(i\) 个位 \(0\) 的概率 \(\frac{n}{n+m}\),第 \(i+1\) 位为 \(1\) 的概率为 \(\frac{m}{n+m-1}\),然后一共有 \(n+m-1\) 个 \(i\),所以期望为 \(\frac{n
阅读全文
摘要:1639 绑鞋带 是个数学题。 先算全部的方案,1有5种选择,然后去掉2个还有3种选择,再去掉2个还剩1个,这就是全部方案 \(5+3+1\)。 再算合法方案,因为只能有一个环,1不能与2连,有4种选择,那1假如连4,那3的话不能连1,2,3,4,还剩2个头,\(4+2\)。 上述结论具有普遍性,全
阅读全文
摘要:51nod 1110 距离之和最小 考虑贪心取中位数,因为中位数到左边的点和右边的点的个数相同,更合理,权值的话可以转化为一个单点,然后没了。 #include<bits/stdc++.h> using namespace std; #define ll long long int n; struc
阅读全文
摘要:动态规划入门题 怎么看着有点像小木棍? 考虑朴素做法,我们设状态为 \(dp[i][j][k]\) 前 \(i\) 个钢筋,组成的第一根钢筋的长度为 \(j\),组成的第二根钢筋的长度为 \(k\),我们用状态储存这对组合有没有过,答案就是所有 \(j==k\) 中存在的最大的答案。 有动态转移方程
阅读全文
摘要:整数分解为2的幂 这题非常厉害,建议认真看下去虽然我讲的也不好。 首先肯定先想到的是多重背包,可以把每个次幂当作物品,然后套板子。 但是这题有 \(O(n)\) 复杂度的做法,我们想如果一个数 \(i\) 是奇数,那他只能由 \((i-1)+1\) 转化过来(2的幂次只有1是奇数),那方案数就是 \
阅读全文
摘要:01 背包 \(n\) 件物品,每件物品有权值和重量,给出背包体积 \(V\),从这些物品中挑选若干件(只能选一次)放入背包,使得背包内物品的总重量不超过 \(V\),问能可以得到的最大权值。 设 \(dp[i][j]\) 选取前 \(i\) 件物品重量为 \(j\) 能取得的最大的权值,可以得到转
阅读全文
摘要:P1337 吊打XXX SA 无疑就这几个步骤。 设初温 t; 降低系数 down<1 设定阈值 更劣随机概率选择(温度越低,概率越低) AI 评价: #include<bits/stdc++.h> using namespace std; #define down 0.996 //降低系数 int
阅读全文
摘要:原题链接 这题因为要求满足 t 时间内,所以用 dp ,不过我们的状态比较特殊,\(dp[i][j]\) 表示到 \(i\) 点时经过 \(j\) 个点的最短时间,因为题目为 DAG 所以要用拓扑排序,每到一个点,枚举所有出边,更新出点的状态 \(f[v][j+1]=min(f[v][j+1],f[
阅读全文
摘要:51nod 1366 贫富差距 这题题面挺抽象的,一个人与他所以的朋友的钱不能超过 \(d\),问朋友链上钱最多的人的钱与钱最少的人的钱相差多少,求差距的最大值 。 如果两个人不属于同一个连通块那么差距可以无穷大,好了特殊情况解决了。然后为了使这个差距最大,那么对于每个朋友我们都取 \(d\) 为权
阅读全文
摘要:暴力构图为 \(O(n^2)\) 无法实现,但可以发现有些边无用,可以先按 x 排序,第 i 号点与第 i+1 号点一定最近,所以建一条边,y 坐标同理,然后跑最短路即可自动选择 \(min(|x_1-x_2|,|y_1-y_2|)\) #include<bits/stdc++.h> using n
阅读全文
摘要:学习笔记 我认为我这个算法可能无法讲明白,而且工作量巨大,所以为了让你快速学会我推荐学习下列笔记。 学习笔记1 学习笔记2 学习笔记3 放个模板 #include <bits/stdc++.h> using namespace std; const int N=1e6+10; char a[N],b
阅读全文