摘要: solution 一个点的点权的可能为不变或者变为连着的边的边权。 然后dp、 dp[u][0]表示变成大于等于w[u]边的最小代价。 dp[u][1]表示变成小于等于w[u]边的最小代价。 然后对边权排序。 一段连续的是使用dp[][0]的和 一段连续的是使用min(dp[][0],dp[][1] 阅读全文
posted @ 2022-08-14 18:42 小饼卷大葱 阅读(35) 评论(0) 推荐(0)
摘要: solution 本来直接写的背包,结果是错误的。 因为最后一枪0->-1->0是不行的。 所以从前到后一次背包,从后到前一次背包。 然后枚举在哪里打的最后一枪。 除了最后一枪都没有什么顺序关系 code #include <bits/stdc++.h> #define FOR(i,a,b) for 阅读全文
posted @ 2022-08-12 12:02 小饼卷大葱 阅读(13) 评论(0) 推荐(0)
摘要: solution 妙,可能类似暴力,但他均摊nlogn。 先只向后走,预处理R[],然后再算真正的R和L。 如果前面的一个点i-1能到达i: 1.如果i也能到达i-1,则i-1和i的答案一样。 2.如果i不能到达i-1,那他的答案就是L=i,R=预处理 其他的情况直接暴力拓展。 code #incl 阅读全文
posted @ 2022-08-11 19:14 小饼卷大葱 阅读(41) 评论(0) 推荐(0)
摘要: solution 从大到小枚举gcd 然后每次把gcd的倍数拿出来,枚举左端点区间。 比如有[1,10,14],左端点区间就是[1,1],[2,10],[11,14] 然后发现,定义一个r[l]表示l最远能到达的没有确定过的边界。 然后这个一定是连续的,就是比r[l]小的他一定都是没用过的,比r[l 阅读全文
posted @ 2022-08-10 16:24 小饼卷大葱 阅读(45) 评论(0) 推荐(0)
摘要: solution 枚举g(),然后二分 code #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<=b;++i) #define int long long using namespace std; const int _=1e6+ 阅读全文
posted @ 2022-08-09 22:23 小饼卷大葱 阅读(21) 评论(0) 推荐(0)
摘要: problem 一个长度为n的数组a,两个人轮流取,想让自己的拿的总和尽量大,都有最优策略,问有几种拿取的方案数。 solution 赛场上做出来了,现在会看又不会了。 先手和后手的最后拿的棋子是定的。 当最大的数出现了奇数次,先手必须要拿这个最大的,不然的话,本来是先手拿x+1个,后手拿x个,现在 阅读全文
posted @ 2022-08-07 20:35 小饼卷大葱 阅读(119) 评论(0) 推荐(0)
摘要: problem 给你一个n<=16的图,求所有生成子图的最小生成森林边权之和。 solution 按照边权枚举每条边的贡献。 考虑[1,i-1]的边权和[i+1,m]的边权。 后者的边权可以随便拿,$ 2^{m-i} $ 考虑前者,当一个子图的u和v已经联通了,就是没有贡献的,其他的情况则都会有贡献 阅读全文
posted @ 2022-08-07 16:21 小饼卷大葱 阅读(38) 评论(0) 推荐(0)