- 博客(28)
- 收藏
- 关注
原创 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 179
原创 [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 102
原创 [背包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 112
原创 [背包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 153
原创 [背包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 157
原创 [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 98
原创 [树形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 353 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 341 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 137
原创 [树形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 159
原创 [树形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 160
原创 [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 344 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 101 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 146 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 97
原创 [树形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 103
原创 [树形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 108
原创 [区间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 156
原创 [区间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 125
原创 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 87
原创 洛谷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 166
原创 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 101
原创 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 124
原创 求大组合数模板
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 60
原创 [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 107
原创 [启发式合并] 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 71
原创 [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 83
原创 [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 119
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人