![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
acwing
想出成果的acmer
当你越来越漂亮的时候,自然有人关注你,当你越来越有能力时,自然会有人看得起你,改变自己,你才有自信,梦想会慢慢的实现,要做好你自己,懒惰可以毁掉一个人,勤奋可以激发一个人,不要等到夕阳西下的时候才对自己说如果当初…如果…我就会怎么样,之类的话,都已经晚了,我只想告诉你一句话:要做一个连自己都羡慕的人!
展开
-
2237. 猪 (网络流实战)
题目题意:1.顾客到达养猪场,将所有他有钥匙的猪舍的大门全部打开,米尔克从所有未上锁的猪舍中挑选一定数量的猪卖给该顾客。2.如果米尔克愿意,他还可以给未上锁的猪舍里剩下的猪重新分配位置。3.在每个顾客到达之前,会将上一个顾客打开的猪舍全部关闭。每个猪舍中都可以放置无限数量的猪。请你编写一个程序,计算他当天可以出售的生猪的最大数量。思路: 如果没有猪舍重新分配猪的限制,很好建模,直接源点向猪舍连边,猪舍向顾客连边,顾客向汇点连边,求最大流即可。但是现在可以重新分配,就比较难。可以按照天数来建点,也原创 2022-12-05 10:37:46 · 101 阅读 · 0 评论 -
2278. 企鹅游行 (网络流拆点)
题目题意: 略。思路: 这个拆点好想,没看题解就想出来了。每个冰块作为一个点,企鹅乱跳作为不同点之间的流量,然后每个冰块的跳跃次数的用拆点的方式限制住。之后枚举汇点得到答案,记得每次枚举之前把网络重置,每条正向边的边权应该是现有边权+反向边的边权,还能流多少+已经流了多少=总共能流多少=容量,反向边的边权清0,变成没流的状态。代码:原创 2022-12-04 21:51:45 · 99 阅读 · 0 评论 -
2180. 最长递增子序列问题 (网络流拆点)
题目题意:给定正整数序列 x1,⋯,xn。1.计算其最长非递减子序列的长度 s。2.计算从给定的序列中最多可取出多少个长度为 s 的非递减子序列。(给定序列中的每个元素最多只能被取出使用一次)3.如果允许在取出的序列中多次使用 x1 和 xn,则从给定序列中最多可取出多少个长度为 s 的非递减子序列。思路: n原创 2022-12-04 21:45:27 · 118 阅读 · 0 评论 -
2187. 星际转移问题 (利用分层图思想建图)
题目题意: 略。思路: 首先用并查集或者dfs的方式判断起点和终点是否连通。之后呢,感觉这个题比较难建图。一个比较好的想法是根据天来建图,每一天建立所有点,不同天同一个点之间建立INF的边(停在某个点的人可以再留一天),再根据每趟车建立某一天的点和下一天的点之间的连边。之后天数从1开始增加即可,因为网络流是可扩展的,新增加了某一天的边之后再跑网络流并不慢。除此之外,建立超级源点和超级汇点,超级源点向第0天的起点连一条流量为k的边;所有天的终点向超级汇点连一条流量为INF的边。代码:原创 2022-12-03 18:53:07 · 163 阅读 · 0 评论 -
2240. 餐饮 (网络流之拆点)
网络流,食物向牛建边,牛向饮料建边,但是发现不对,因为没有约束牛的流量是一,可能某个牛多次被分配食物,这样的话就wa。可以把牛拆成两个点,分别负责入边和出边,之间用边权为1的点连接,限制每头牛最多被分配一套食物和饮料。给定n头牛,每头牛喜欢mi种食物,ki种饮料。每个牛只需要一个食物和一个饮料,每个食物和饮料被分配给一头牛之后不能再分配给别的牛。让尽可能多的牛吃到喜欢的食物和饮料,输出数量。原创 2022-12-01 22:47:02 · 118 阅读 · 0 评论 -
网络流之关键边
所谓的关键边,即增大这条边的边权之后能增大最大流的流量。给定有向图,求出图中的所有关键边。原创 2022-12-01 16:35:42 · 206 阅读 · 0 评论 -
最大流之上下界可行流
一个直观的想法是求超级源点到超级汇点的最大流,之后再求原图中源点到汇点的最大流(因为求完第一个最大流之后可能还存在原图中源点到汇点的增广路)。因为求出超级源点到超级汇点的最大流(满流)之后,他们对应的边就算废了,因为都是满流,相当于没有。这个时候把正无穷的边删去,求得的原图中源点到原图中汇点的最大流满足可行流的定义(流量限制和容量限制)。这时我们发现只要求出新图中的最大流,如果他是满流的,就对应了原图中的一个可行流。先求出满流,保证是个可行流,然后再求原图中汇点到源点的最大流,反着流最大即正着流最小。原创 2022-12-01 16:31:37 · 551 阅读 · 0 评论 -
4715. 构造数组 (差分约束)
长度为n的数组,有n-1条约束,op:、=: a[i] op a[i+1].要求a1+a2…如果是求最小值,则跑最长路,有约束 x =c,则建边(y,x,c).如果要求初始化xi>=c或者xi=c或xi-x0原创 2022-12-01 11:11:55 · 54 阅读 · 0 评论 -
Acwing提高课图论补题 920. 最优乘车
题目题意: 给定m个路线,n个点。m个路线是说,某条路线上左边的点可以花0的代价到达右边的点。但是从某条路线换到另一条路线就要花费1的代价。思路: 用最笨的方法,建图。建图是mn2/2的。同一条路线上的花费为1.最后结果为dist[n] - 1.因为第一次是不换乘的,从第二次开始就换乘了。时间复杂度: O(mnn)代码:// Problem: 最优乘车// Contest: AcWing// URL: https://www.acwing.com/problem/content/922//原创 2022-04-16 13:56:06 · 148 阅读 · 0 评论 -
1077. 皇宫看守 (树形dp+状态机)
题目题意: 给定n个点的树,每个点有点权ai。选中点i后,可以观察到点i相邻的所有点(包括点i)。求最小的花费,使得所有点可以被观察到。思路:时间复杂度: O(n)代码:// Problem: 皇宫看守// Contest: AcWing// URL: https://www.acwing.com/problem/content/1079/// Memory Limit: 64 MB// Time Limit: 1000 ms// // Powered by CP Editor (h原创 2022-03-30 20:51:29 · 231 阅读 · 0 评论 -
第一届ACC联赛 决赛 C(什么换根dp)
题目题意: 给定一棵n个点的有向树,选中一个点为根,使得到达个点的距离和最小。对于无法到达的点,可以将边进行翻转,求最少的翻转次数。思路: 先建树嘛,给定的边边权为0,反边边权为1。随便选中一点root进行dfs,求出以root为根的最小代价。之后进行换根dp,这个换根还算简单的,连我都能想出来。。。对于u的儿子j,如果根从u换成了j。假设u到j的边权为1,换根以后j不需要代价即可到达u,所有u能到的点j也能到。f[j] = f[u]假设u到j的边权为0,j到u边权则为1,需要1的代价从j到u。f原创 2022-03-30 16:45:18 · 132 阅读 · 0 评论 -
第一届ACwing联赛 C
题目题意: 给定n个数,要求选出k个长度为m的区间(两两不相交),使得这些区间的和最大。思路: dp.f[i][j]: 从前i个数中选,选出j个区间的最大和。f[i][j] = max(f[i-1][j],f[i-m][j-1] + s[i] - s[i-m])第i个数要么在第j组中,要么不在。时间复杂度: O(n*n)代码:// Problem: 选取数对// Contest: AcWing// URL: https://www.acwing.com/problem/content/4原创 2022-03-21 19:26:13 · 172 阅读 · 0 评论 -
AcWing周赛43 C(太菜咧)
题目题意: 给定数组a,求有多少个数对(l,r)满足s[r] - s[l-1] < t. (-1e9<=a[i]<=1e9)思路: 如果都是正数,双指针或者二分都行。但是有负数,就不能这么做了。找一下等价关系,对于每一个右端点r,找多少个数满足s[r] - t < s[l-1].可以动态维护前缀和,之后树状数组查询。但是前缀和太大,需要离散化之后才能扔到树状数组里。时间复杂度: O(nlogn)代码:// Problem: 合适数对// Contest: AcWing/原创 2022-03-21 19:17:41 · 303 阅读 · 0 评论 -
323. 战略游戏 (树形dp)
题目题意: 给定n个点的树,选择最少的点,使得可以涵盖到所有的边。(不一定n-1条边,至多10*n条边)思路: 树形dp.f[i][0]: 以i为根且选择i的最少点数的方案f[i][1]: 以i为根且不选择i的最少点数的方案如果选i,儿子可选可不选;如果不选i,必须选儿子(这条边一共就两个点连着,必选了)时间复杂度: O(n)代码:#include<bits/stdc++.h>using namespace std;int n,m,k,T;const int N = 150原创 2022-03-16 22:08:12 · 4384 阅读 · 0 评论 -
1075. 数字转换 (埃氏筛+树形dp)
题目题意: 如果一个数 x 的约数之和 y(不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x。对从1到n的所有数进行建树操作,求不出现重复数字的前提下最多能够变换多少次。思路: 先预处理一下每个数的因数之和,拿埃氏筛筛一下。之后这个问题就变成了以1为根,求树的最长路径,按1072题的树形dp跑一下即可。时间复杂度: O(nloglogn + n)代码:#include<bits/stdc++.h>using namespace std;const int N =原创 2022-03-15 22:24:25 · 228 阅读 · 0 评论 -
1073. 树的中心 (树形dp)
题目题意: 给定n个点的树,请你在树中找到一个点,使得该点到树中其他结点的最远距离最近。思路: 树形dp。一遍dfs求出每个点到其他节点的最远距离,之后枚举一遍即可。可以将一个节点分成向下走和向上走,向下走好说,dfs呼呼走就行。如果是向上走呢?我们可以维护次长路和最长路对应哪个儿子son,对于当前点cur 的儿子j,如果他是最长路对应的儿子son,up[j] = max(up[cur],d2[cur]) + w[i];否则,up[j] = max(up[cur],d1[cur]) + w[i].因为该原创 2022-03-15 21:38:52 · 241 阅读 · 0 评论 -
Acwing 1072 求树的直径(dfs || 树形dp)
题目题意: 求树的直径,但是可能有负边权,用两遍dfs不行。思路: 树形dp. 以i为树根的最大路径为经过i的最大路 + 次大路,只要我们求出max{以每个点为树根的最大路+次大路}即可得到答案.时间复杂度: O(n)代码:#include<bits/stdc++.h>using namespace std;#define mem(a,x) memset(a,x,sizeof(a))const int N = 1e4+10;int h[N],e[N<<1],ne[N原创 2022-03-15 20:55:48 · 204 阅读 · 0 评论 -
Acwing周赛42 C(太菜咧)
题目题意: 给定深度为n的完全二叉树,可以任意增加任意边的边权,求最少需要增加多少才能使得树根到叶子节点的距离均相等。(n<=10)思路: dfs。能在上边加的就在上边加,因为这样涉及面广。假设左子树的路径和为l,右子树的路径和为r,dfs求出以i为树根的最大路径和。贡献为abs(l-r).时间复杂度: O(2^n)代码:// Problem: 满二叉树等长路径// Contest: AcWing// URL: https://www.acwing.com/problem/content原创 2022-03-13 10:51:53 · 302 阅读 · 0 评论 -
Acwing周赛42 (KMP,偷偷拿字符串哈希水过去了)
题目题意: 分别给出长度为n和m的字符串a、b,有q次询问,询问在字符串a的[l,r]中出现了多少次b。思路: KMP匹配一下,然后维护一下前缀和,即可O(1)查询。时间复杂度: O(n+q)代码:// Problem: 出现次数// Contest: AcWing// URL: https://www.acwing.com/problem/content/4315/// Memory Limit: 256 MB// Time Limit: 1000 ms// // Powered b原创 2022-03-13 10:38:44 · 84 阅读 · 0 评论 -
食物链(带权并查集)
题目题意: 有三类动物,A吃B、B吃C、C吃A。现在给出k句话,判断有多少句话为假话。如果某句话与前边的话形成的条件存在冲突,默认这句话为假,否则为真。1 x y: x和y为同类2 x y: x吃y**思路:**维护带权并查集,0:与祖宗同类,1:吃祖宗那一类,2:被祖宗吃。时间复杂度: O(n + k*α(n))代码:// Problem: 职业玩家// Contest: QDUOJ// URL: https://qduoj.com/problem/22Spring10// Memo原创 2022-03-08 21:32:10 · 169 阅读 · 0 评论 -
Acwing周赛45 C (今天好菜,希望明天能像个正常人)
题目题意: 给定n个节点的树,以1为根。规定dfs时优先搜索编号小的点,而且给出边的顺序也按从小到大给的。给定m次询问,O(1)求出以u为树根进行dfs的第k个数。思路: 感觉和以前打的一场abc的E有点像,但是不太会写,乱写了一个T了,然后一直思绪乱乱的,直接罚坐了,200多人过的题都不会,确实不应该。 从树根开始搜和从u开始是一样的,所以从树根搜一遍得到的序列就可以O(1)查询。那么怎么记录呢?dfs序的第i个数对应出现次序为i,u的出现次序+k-1即以u为树根进行dfs的第k个数。如果以u为树原创 2022-03-05 22:25:27 · 62 阅读 · 0 评论 -
Acwing周赛36 C(经典BinarySearch不会)
题目题意: 在二维坐标系中要从(0,0)移动到(x,y)。给定长度为n的字符序列,表示移动指令。可以对序列进行任意修改,找到一种修改区间最小的方案。或者确定无解。思路: 二分.我当时都没想到用二分,太lao了。总感觉要枚举区间会寄。但是二分区间长度+O(n)check就是O(nlogn),很合理。只能说模型抽象能力亟待提高。二分区间长度,枚举区间起点O(n)check。这里注意到本题的一个性质,序列长度为偶数,x、y坐标的偏移和也为偶数。如果目标abs(x)+abs(y)与n的奇偶性不同,那指定寄了,或原创 2022-01-30 09:44:55 · 179 阅读 · 0 评论 -
acwing周赛36 B(经典不读题直接搜模板)
题目题意: 给定无向图,判断该图是否是一个有且仅有一个环的连通图。(无重边和自环)思路: 首先dfs判断一下是否连通。如果m == n-1,是一棵树,没法有环。m == n,恰好一环。 m > n,不止一环。时间复杂度: O(n+m)代码:#include<bits/stdc++.h>using namespace std;vector<int> va[102];bool vis[102];int n,m;int cnt = 0;void dfs(int原创 2022-01-30 09:30:08 · 107 阅读 · 0 评论 -
寒假每日一题 2022/1/6 思维题
题目题意: 给定n个小山,小山的高度为Hi。在第t秒时,所有高度<=t的小岛都会被淹没。而剩余没有淹没的连续的小山会形成"a line"。求所有t中"a line"的最大数量。思路: 按照小山的高度排序,之后枚举每个小山的高度。我开始想的是枚举完再O(n)check,典中典只会暴力。但是看到y总说可以看变化的值Δx。对于淹没的小山a[id],看一下他左右的情况。1.左右都不被淹没,多出一个"a line". cnt ++2.左右都被淹没,这个peak就寄了,少一个"a line". cnt原创 2022-01-09 20:35:50 · 278 阅读 · 0 评论 -
寒假每日一题 2022/1/5 双端bfs
题目题意: 在二维坐标系中,初始位于(sx,sy)处,求到达原点(0,0)的最小花费。规定走平地花费为0,走一个障碍花费为1。给定n个barrier坐标(x,y),其余为平地.思路: 双端bfs模板题。本题的实质是求一个图最短路,但是大概有n^2个边。用堆优化的Dij时间复杂度也很高。而双端bfs恰好可以解决此类问题,图中的边权均为0或1。只需要花O(n)的时间即可,n是点的总个数。 基本思想与队列bfs一致。只是更新时,通过边权为0的边更新的点放到队首;而通过边权为1的边更新的点放到队尾。时间复杂原创 2022-01-09 20:16:15 · 276 阅读 · 0 评论 -
AcWing周赛29 B(rank 14,什么时候能凭实力拿帽子鸭)
当时以为能拿帽子了,题比较简单。第二题还偷偷搜了怎么做,第三题因为着急没开long long wa了5发,最后罚时飞上了天。但是就算不wa5发,只wa一发也拿不了帽子,不影响结果。放平心态,越在乎越容易寄,希望以后的比赛无论大小,可以吸取到这次的教训。题意: 经典问题,给定一个数轴,n个区间[l,r].问数轴上被区间恰好覆盖1 - n次的点各有多少。 n = 1e5,l,r<=1e18.思路: 考虑差分,对于每个区间进行差分计数,具体操作为mp[l]++,mp[r+1]–.之后扫描整个map,记录原创 2021-12-12 15:45:04 · 470 阅读 · 0 评论 -
Acwingf周赛27 B
B.题意: 给定n和m,表示矩阵的行和列。矩阵中每个元素的大小为i*j。给定k,输出矩阵中第k大的数。n,m = 5e5思路: 线性筛(bushi)二分。找满足条件的最小值,满足有>=k个数比它小,所有满足条件的数中的最小值即是答案。花O(n)的时间check时间复杂度: O(n) * O(n + m)代码:// Problem: 第k个数// Contest: AcWing// URL: https://www.acwing.com/problem/content/4083///原创 2021-11-29 18:37:14 · 252 阅读 · 0 评论 -
Acwing周赛26 C (简单dp都不会,建议/remake)
题目题意: 询问长度为[l,r]的所有优秀字符串的个数. 优秀字符串: 首先是一个01字符串,可以将任意k个连续的1变成0,如果它最后可以变成全0,就是优秀字符串。思路: 显然,全0串可以,恰好有k个、2*k个连续的1的串也可以。 考虑dp。(我还以为是计数题,推了半天公式过了样例,然后wa了。。。) 定义f[i]为长度为i的合法方案数。 f[i] = f[i-1] + f[i-k]. (分别对应最后一位为0,最后一位为1的状态转移) 前缀和维护f[i]即可,答案为s[r] - s原创 2021-11-21 15:15:19 · 567 阅读 · 0 评论 -
AcWing 383. 观光(上课摸鱼(×)开摆(√))
题目题意: 给定n个点,m条有向边。给定起点S和终点T。求最短路的方案数 + 仅比最短路长度大1的路径的方案数.思路: Dij + dp.涉及到dp我就不会了。最短路方案数易求,比最短路长度大1的路径方案数是关键。Dij预处理距离数组dist[]考虑dp: f[u][k]: 表示到u点长度为dist[u] + k的方案数答案为f[T][0] + f[T][1]转移: f[j][k] = f[j][k] + f[u][k], if(dist[j] == dist[u] + w[i]).原创 2021-11-06 19:36:50 · 91 阅读 · 0 评论 -
Acwing周赛22 B(怎么有人连二分都不会啊?指自己)
题目题意: 给定n个数,求ans[i].ans[i]表示比i小且二者不存在矛盾的数的数量.给定m对关系,表示两个数之间有矛盾.思路: 我直接树状数组维护不就完了,这个矛盾不知道怎么处理。但是冷静分析,可以在输入m对关系的时候预处理一下,提前存储比x小的且有矛盾的数。ans[i] = sum(a[i] - 1) - cnt[i].二分和树状数组都可.代码:#include<bits/stdc++.h>using namespace std;const int N = 2e5+1原创 2021-11-04 20:53:59 · 68 阅读 · 0 评论 -
ACW734. 能量石
题目**题意:**给定n个物品的消耗时间s,初始价值e,每秒价值的衰减值l.对于每个物品,当选择它的时候,获得的价值为当前的价值,而不用考虑再衰减。能量最多衰减至0.思路: 先贪心,后dp.假设最优解的能量石排列长度为k(1<=k<=n)k(1<=k<=n) .那么对于任意两个位置al和al+1 (1 <= l < k)交换...原创 2021-10-29 23:12:33 · 154 阅读 · 0 评论