自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

玛珈山大萌新

破山中贼易,破心中贼难。不破不立,破而后立,力而为人。

  • 博客(179)
  • 收藏
  • 关注

原创 待学知识

筛素数n2/3n^{2/3}n2/3算法 分解质因数算法Pollard_Rho Miller_Rabin判断质数

2020-11-07 22:11:56 85

原创 [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 <&lt

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 &lt

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

原创 [AcWing面向模型编程]数论

质数定理:1 - n中有n / lnn个质数

2020-09-25 18:22:15 96

原创 求大组合数模板

之前总是上网查,还查不到完整的,有点浪费时间,还是得背过 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关注的人

提示
确定要删除当前文章?
取消 删除