Acwing算法提高课
玛珈山大萌新
破山中贼易,破心中贼难。不破不立,破而后立,立而为人。
展开
-
最大流之上下界可行流
题目:AcWing 2188. 无源汇上下界可行流分析:每条边的容量范围整体减小下限个单位,不足用源点汇点补。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗//typedef __int128 lll;#define print(i) cout << "debug: " << i << endl#define原创 2021-01-27 22:03:55 · 134 阅读 · 0 评论 -
[AcWing面向模型编程]1285. 单词
题目:1285. 单词分析:若b串是a串的子串,那么b串一定也是a串某个前缀的后缀。因此我们从下往上遍历每个点,将其贡献加到其nex点即可(理论依据是:拓扑序)代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout << "debug: " <&原创 2020-11-20 20:25:39 · 133 阅读 · 0 评论 -
AcWing 253. 普通平衡树
Treap平衡树题目:253. 普通平衡树您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:插入数值x。删除数值x(若有多个相同的数,应只删除一个)。查询数值x的排名(若有多个相同的数,应输出最小的排名)。查询排名为x的数值。求数值x的前驱(前驱定义为小于x的最大的数)。求数值x的后继(后继定义为大于x的最小的数)。注意: 数据保证查询的结果一定存在。输入格式第一行为n,表示操作的个数。接下来n行每行有两个数opt和x,opt表示操作的序号(1<原创 2020-11-19 15:14:46 · 123 阅读 · 0 评论 -
AcWing 352. 闇の連鎖 (树上差分)
题目:352. 闇の連鎖分析:m条边,每一条都会使得树上路径上的每一条边所处的环数++,求和可以用树上差分解决。每一条边可能处于多个环中,如果处于的环数为0,则ans+=m,若环数为1,则ans++,否则无法通过剪断该边来贡献答案。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define p原创 2020-11-18 11:47:50 · 82 阅读 · 0 评论 -
[AcWing面向模型编程]线段树
线段树题目1(单点修改,区间最值):Acwing1275. 最大数给定一个正整数数列 a1,a2,…,ana1,a2,…,an,每一个数都在 0∼p−1 之间。可以对这列数进行两种操作:添加操作:向序列后添加一个数,序列长度变成 n+1;询问操作:询问这个序列中最后 L 个数中最大的数是多少。程序运行的最开始,整数序列为空。写一个程序,读入操作的序列,并输出询问操作的答案。代码:#include <bits/stdc++.h>using namespace std;原创 2020-11-10 22:24:57 · 177 阅读 · 0 评论 -
[AcWing面向模型编程]树状数组
题目1:243. 一个简单的整数问题2分析:presum[i]=sum1(i)∗(i+1)−sum2(i)presum[i] = sum1(i) * (i + 1) - sum2(i)presum[i]=sum1(i)∗(i+1)−sum2(i)sum1(i)是求差分ai的前缀和sum2(i)是求i * ai的前缀和维护两个前缀和代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞原创 2020-11-10 16:00:03 · 137 阅读 · 0 评论 -
[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 · 200 阅读 · 0 评论 -
[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 · 70 阅读 · 0 评论 -
[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 阅读 · 0 评论 -
[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 · 99 阅读 · 0 评论 -
[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 阅读 · 0 评论 -
[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 阅读 · 0 评论 -
[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 · 132 阅读 · 0 评论 -
[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 · 89 阅读 · 0 评论 -
[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 · 192 阅读 · 0 评论 -
[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 · 115 阅读 · 0 评论 -
[acwing面向模型编程]状态机模型
题目:1057. 股票买卖 IV分析:我们假设每一次交易分为两个阶段,第一个阶段是先买入,第二个阶段是卖出。设dp(i, j, 0)表示考虑前i天,在第j次交易中我们已经卖出(第j次交易已经完全完成),dp(i, j, 1)表示考虑前i天,在第j次交易中我们已经买入(第j次交易的第一个阶段完成)。状态机模型如下代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//typedef __int1原创 2020-09-14 19:57:19 · 182 阅读 · 0 评论 -
[acwing面向模型编程]背包九讲
题目:6. 多重背包问题 III分析:单调队列优化多重背包,时间复杂度O(N * V)(也可用二进制优化做,不过复杂度多一个logloglog)代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//typedef __int128 lll;#define print(i) cout << "debug: " << i << endl#define clos原创 2020-08-17 17:53:20 · 189 阅读 · 0 评论 -
[acwing面向模型编程]最长上升子序列模型
题目1:1012. 友好城市题意:Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。输入格式第1行,一个整数N,表示城市数。第2行到第n+1行,每行两个整数,中间用原创 2020-08-06 22:22:44 · 121 阅读 · 0 评论