- 博客(179)
- 收藏
- 关注
原创 [Acwing面向模型编程]dfs
题目1:AcWing 1118. 分成互质组 分析: 枚举每个组,对于当前的组,如果枚举到的数能够放进去,那么就一定放进去(不需要另外开一个新的组),如果当前组无法再放数,则新开辟组。 一开始用的vector,一直t。看来搜索慎用stl 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define
2020-11-03 21:22:51
261
原创 [AcWing面向模型编程]第k短路
题目:178. 第K短路 分析:模板 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endsl #define close() ios::sync_with_stdio(0), ci
2020-11-03 15:05:43
91
原创 二分搜索符合条件的最大最小值
当要求解的问题有多种解时,要求符合条件的最大/小的值,可以通过二分枚举解来解决(同时注意二分过程的判断和终值,可以作为模板背过) poj 2456 Aggressive cows | 求解符合条件值的最大值 题意: 给你n个坐标,求c个坐标中最小的最大距离。 分析: 注意while()循环的条件是l <= r, 最后结果是r。 同时判断函数可以通过贪心的思想写。 代码: #include <iostream> #include <algorithm> using namespa
2020-11-01 17:35:40
322
原创 2019 ICPC 南昌 Regional K. Tree(树上启发式合并 + 动态开点线段树)
分析: 对每一个值建立一棵线段树树,保存[l, r]内的深度出现的次数,然后通过启发式合并统计答案即可 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define clo
2020-10-31 11:40:13
218
原创 [AcWing面向模型编程]179. 八数码
题目:179. 八数码 分析: A*板子题 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endsl #define close() ios::sync_with_stdio(0),
2020-10-29 01:11:17
133
原创 [背包dp]P4095 [HEOI2013]Eden 的新背包问题
题目:P4095 [HEOI2013]Eden 的新背包问题 分析: 这个题是扣除一类物品的多重背包,可以正向、逆向跑两次多重背包(用二进制优化),然后对于扣除的位置pospospos,枚举两侧的体积,求最值。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout &
2020-10-28 15:10:50
151
原创 [背包dp][AHOI2013]找硬币
题目:[AHOI2013]找硬币 分析: 贪心:由于硬币之间都是倍数关系,所以优先放大硬币。 dp[i]表示最大面值为i的答案。 枚举方式:先枚举次大硬币值iii,再枚举最大值是次大的jjj倍,然后算一下每个硬币减少量即可。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i)
2020-10-28 11:53:18
207
原创 [背包dp]小明打联盟
题目:小明打联盟 分析: 这个题是一个完全背包问题,对于大招,我们有三种选择:l,l+i,rl, l + i, rl,l+i,r,最终的方案中l+il + il+i最多出现一次,于是先用前三个物品+l+r前三个物品+l + r前三个物品+l+r这五个物品跑完全背包,然后用l+il + il+i更新一遍dp[v]dp[v]dp[v] 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开
2020-10-27 22:00:44
204
原创 [AcWing面向模型编程]双向广搜
题目1:190. 字串变换 分析: 题意是将一个字符串通过替代局部转换成另一个字符串,求最少转换次数。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define clo
2020-10-27 18:39:23
120
原创 [树形dp-贪心][HNOI2003]消防局的设立
题目:[HNOI2003]消防局的设立 分析: 这题是三星题??不就是个简单贪心吗?好吧,贪心、dp两两不分家,看来刷dp还是能练很多方面的能力的。 很容易的分析出来,对于整棵树最深的叶子结点u,我们肯定选fa[fa[u]],而不选u。这样对于整棵树,我们可以每次选取深度最深的点u,然后染色他的祖父。可以用优先队列实现。 这题竟然是三星???是三星?? 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;/
2020-10-26 18:05:23
387
3
原创 [2020 China Collegiate Programming Contest Weihai Site - 重现赛] L Clock Master
分析: 这个题是一个分组背包问题。v=a1p1+a2p2+...+anpnv = a1^{p1}+a2^{p2}+...+an^{pn}v=a1p1+a2p2+...+anpn 每一个质因数的幂次的集合就是一个分组。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cou
2020-10-26 16:58:46
397
1
原创 [树形dp][HAOI2015]树上染色
题目:[HAOI2015]树上染色 分析: dp[i][j]表示第i个点染j个黑色时的对答案的最大贡献。 这里我们采用“合并法”求dp,即将两个子问题合并算大问题的答案。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " &l
2020-10-26 08:55:03
169
原创 [树形dp][FJOI2014]树的重心(100行dp,胆小慎入)
题目:[FJOI2014]树的重心 分析: 这题在牛客网才三星?那五星就是final金牌题了呗?我人没了。 放弃分析,日后复习,感觉好题。 参考博客 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i &l
2020-10-23 16:57:38
202
原创 [树形dp][CQOI2009]叶子的染色
题目:[CQOI2009]叶子的染色 分析: 根可以随便选一个非叶子结点。 dp[u][k]表示u结点染成k色使得u子树合法的最小染色数。 可以想到如果u的孩子v染了k色,那么v的k色完全可以染在u上,不需要染v。可以得到转移方程: 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define pri
2020-10-21 20:42:38
204
原创 [2020 China Collegiate Programming Contest Qinhuangdao Site-重现赛]7-11 Kingdom‘s Power
分析: 设dp[u]表示假设兵营建在u点,征服u子树的最少时间,先上个图。 贪心的策略是:先访问深度较小的u的子树vi,然后考虑次浅的子树vj的时候,兵来源有两个,一个是root,一个是vi最深的孩子,两者取较小的即可。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i)
2020-10-21 20:28:31
379
4
原创 [树形dp]选点
题目:选点 分析: 看似是树形dp,其实是个LIS 考虑到父节点跟左右儿子的大小关系,将三者按根、右儿子、左儿子排成一个数组,然后跑LIS即可,太妙了,我又没想出来。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " <
2020-10-21 14:59:33
142
1
原创 [树形dp + 组合数学]蓝魔法师
题目:蓝魔法师 分析: dp[i][j]表示对于i这个子树来说,i所在的连通块大小为j,并且整棵树合法的方案数。 接下来就是类似背包的解法了。遍历每个儿子的分支,每个分支要么删除,要么不删除。 1.删除: 删除此边,那么就意味着当前以u节点连通块大小为k的方案数 都可以 乘 v节点连通块大小所有的方案数: 2.不删除 不删除就相当于合并那么此时直接跑两个循环即可: for(int i=1;i<=min(sz[u]*1ll,m);i++){ for(int k=1;k<=min(sz[e
2020-10-21 11:39:30
200
1
原创 [树形dp + 换根]Tree
题目:Tree 分析: 这个题第一步很好想,求出每个子树的答案。难的是如何求u上方的贡献。 (引用) 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define clo
2020-10-20 21:24:20
128
原创 [树形dp]旅游
题目:旅游 分析: 一道2星的题,一开始还想成贪心找叶子,太菜了。 dp[i][0/1]表示不选/选当前结点的最大时间 还是菜,毕竟树形dp做的太少了 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i &
2020-10-20 19:28:35
142
原创 [树形dp+贪心]黑白树
题目:黑白树 分析: 叶子结点一定选,从下往上,对于当前u维护一个如果再选一个子节点能够往上最远的距离maxlen,和不选u能够向上到达的最远距离nowlen。当nowlen=0时,就不得不选一个点(这里我们不关心选了哪个点),使得nowlen = maxlen 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 ll
2020-10-20 17:40:15
145
原创 [区间dp][HAOI2008]玩具取名
题目:[HAOI2008]玩具取名 分析: 简单的区间合并,因为最终结果的长度最多为4,所以dp设为3维,dp[i][j][k]表示[i, j]区间内能否由k这个字母产生。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " &
2020-10-19 21:24:44
190
原创 [区间dp]合并回文子串
题目:合并回文子串 分析: dp[i][j][k][p]表示a串的[i, j]和b串的[k, p]能否通过交叉且保持原有顺序不变形成回文串。 4维dp, 先枚举长度,再枚举位置,状态合法则贡献答案。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout <<
2020-10-19 11:56:27
166
原创 Counting Stars HDU - 6184[三元环计数]
题目: 给你一个图,求有多少不同的由两个三元环拼起来的图形。 分析: 三元环计数题,考虑每个边的贡献,设num = 每个边参与构成的图形数,则贡献为num * (num - 1) / 2,注意用链式前向星来存边的贡献。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) co
2020-10-18 01:00:03
123
原创 洛谷P1989 无向图三元环计数
分析: 洛谷题解 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define close() ios::sync_with_stdio(0), cin.tie(0), c
2020-10-17 22:51:53
249
原创 XOR key 51Nod - 1295 [可持久化trie]
分析: 像主席树那样可持久化 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define close() ios::sync_with_stdio(0), cin.tie
2020-10-13 22:11:44
138
原创 Query on A Tree HDU - 6191
分析: 解法1:离线+trie合并(自下而上合并) 解法2:可持久化数据结构 代码: //解法1 #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define close() io
2020-10-13 20:54:56
159
原创 求大组合数模板
ll fac[maxn]; ll inv[maxn]; ll powmod(ll a, ll n) { ll res = 1; while(n) { if(n & 1) res = res * a % mod; n >>= 1; a = a * a % mod; } return res; } void init() { fac[0] = 1; for(int i = 1; i &
2020-10-12 21:43:31
84
原创 [AcWing面向模型编程]trie
题目1:AcWing 143. 最大异或对 分析: 01字典树模板题 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;//三年竞赛一场空,不开 long long 见祖宗 //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define close() ios::sync_
2020-10-12 01:01:15
140
原创 [启发式合并] Codeforces600E Lomsat gelral
题目1:[Codeforces600E]Lomsat gelral 分析:强推入门视频 个人的理解 由于空间有限,处理过的子树的答案不能全都存起来,但是暴力搜索又会tle,所以就有了启发式合并。启发式合并的核心思想就是:通过仅仅保留当前根的重儿子所在的子树的计算结果、重复计算轻儿子,从而大大减少计算量,复杂度n∗lognn * lognn∗logn 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll;/
2020-10-10 22:01:45
101
原创 [AcWing面向模型编程]斜率优化dp
题目1:300. 任务安排1 分析: 直接去想的话,状态转移的时候无法得知上一个状态到底划分了几批,无法计算总的时间。但是如果每次我们计算状态的时候,将当前的一次划分的时间s对后面所有的任务产生的花费计算在内的话,问题就变得很简单了。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 lll; #define print(i) cout << "debu
2020-10-07 22:35:07
112
原创 [AcWing面向模型编程]单调队列优化dp
题目1:1089. 烽火传递 分析: 分析简单。主要注意初始化问题:将dp[0]放入一开始的队列中。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define close() ios::sync_with_stdio(
2020-10-06 19:51:23
168
原创 [AcWing面向模型编程]树形dp
题目1:1072. 树的最长路径 分析: 树的直径模板题。 注意:dfs返回的是当前子树最长链的长度。对每个根来说,最长链和次长链的和最大的即为答案。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl #define clos
2020-09-30 14:45:03
174
原创 [AcWing面向模型编程]区间DP
题目:321. 棋盘分割 分析: dp[x1][y1][x2][y2][k]表示在(x1, y1) ~ (x2, y2)的区域内分成k个块所贡献的结果,然后分横竖枚举划分方式,这个dp要用记忆化搜索写,循环写太麻烦。 逐渐明白了记忆化搜索对于dp的意义 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 lll; #define print(i) cout <
2020-09-29 22:24:46
113
原创 Lunch HDU - 6892(博弈)
题目:Lunch HDU - 6892 分析: NIM博弈,考虑对每一个巧克力求sg函数: 对于长度为l的巧克力,sg(l)等于l的非2质因数的指数和+l是否为偶数 证明放弃 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 lll; #define print(i) cout << "debug: " << i << endl
2020-09-25 21:23:06
368
原创 求大组合数模板
之前总是上网查,还查不到完整的,有点浪费时间,还是得背过 ll powmod(ll a, ll n) { ll res = 1; while(n) { if(n & 1) res = res * a % mod; n >>= 1; a = a * a % mod; } return res; } void init() { fac[0] = 1; for(int i = 1; i &
2020-09-25 10:57:58
81
原创 [AcWing面向模型编程]博弈论
题目:893. 集合-Nim游戏 分析: 最经典的NIM游戏是每次可以拿至少一个,但是不能不拿。这个题目改成了只能拿一些固定的数值。其实本质上都是一样的,都是求出每个堆的SG函数,经典的NIM游戏的SG(X)恰好等于X。而这个题需要用记忆化搜搜的方式求(保证每个x只求一次SG),然后最后整个异或和判断一下非零完事了。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128
2020-09-22 15:24:50
242
原创 [AcWing面向模型编程]状态压缩dp
题目:292. 炮兵阵地 分析: 状态表示:dp[i][j][k]表示考虑前i行,且第i行的状态为j,第k行的状态为k的情况下的部署最大值。 状态计算:dp[i][j][k] = max(dp[i][j][k], dp[i - 1][k][u](j, k, u分别为当前行,当前行的上一行,当前行的上两行,且j, k, u均不能互相伤害) 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //type
2020-09-21 21:59:15
149
原创 2020牛客暑期多校训练营(第八场)
题目:I.Interesting Computer Game 分析: 参考博客 简单来说就是将每个数字看成一个点,然后每一对数可以连一条边,最后对于每个连通分支,如果有环,则结果只能+=该联通分支的点数,否则结果+=点数-1 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 lll; #define print(i) cout << "debug: "
2020-09-17 15:47:00
78
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人