08 2022 档案
摘要:最大流。 最小割 把S和T割断的最小的花费容量。 等于最小割。 最大权闭合子图 luoguP2762 太空飞行计划问题链接
阅读全文
摘要:solution 当ai为Fib数的时候,他一定在串中是全部连续的,不然就g,因为把他分解成小的Fib数必定连续。 一个数字不能拆成两个连续的fib数。 考虑最大的ai出现的区间。 f[x] f[x+1] f[x+2] 显然当(f[x+1],f
阅读全文
摘要:有一个稳定服务器,还有五个连上就能用的服务器(<=5)。 二进制枚举用不用,然后拆点就ok了。 网络流
阅读全文
摘要:A ad和cb,查看是不是相等或者倍数关系,特判0 B sort() cout<<a[n]+a[n-1]-a[1]-a[2] C 查看所有的四方格 一个四方格有2个0,ans=1的个数 一个四方格有1个0,ans=1的个数-1 一个四方格有0个0,ans=1的个数-2 D1 直接暴力从前260个转移
阅读全文
摘要:problem 一棵树,有root,一个点只能向根跳k步直到不能走,问先手必败还是必胜。 root从1到n,回答n次 solution 一次的话就是一个阶梯nim。 多次的话,就要换根。 换根的话,虽然会全局影响,但是对答案没啥影响。 tips 这里的dp是dp[n][2k]不是dp[n][k]][
阅读全文
摘要:solution 暴力sg,打牌 code #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<=b;++i) #define ll long long using namespace std; const int _=1e6+7; /
阅读全文
摘要:solution 一个点的点权的可能为不变或者变为连着的边的边权。 然后dp、 dp[u][0]表示变成大于等于w[u]边的最小代价。 dp[u][1]表示变成小于等于w[u]边的最小代价。 然后对边权排序。 一段连续的是使用dp[][0]的和 一段连续的是使用min(dp[][0],dp[][1]
阅读全文
摘要:solution 本来直接写的背包,结果是错误的。 因为最后一枪0->-1->0是不行的。 所以从前到后一次背包,从后到前一次背包。 然后枚举在哪里打的最后一枪。 除了最后一枪都没有什么顺序关系 code #include <bits/stdc++.h> #define FOR(i,a,b) for
阅读全文
摘要:solution 妙,可能类似暴力,但他均摊nlogn。 先只向后走,预处理R[],然后再算真正的R和L。 如果前面的一个点i-1能到达i: 1.如果i也能到达i-1,则i-1和i的答案一样。 2.如果i不能到达i-1,那他的答案就是L=i,R=预处理 其他的情况直接暴力拓展。 code #incl
阅读全文
摘要:solution 从大到小枚举gcd 然后每次把gcd的倍数拿出来,枚举左端点区间。 比如有[1,10,14],左端点区间就是[1,1],[2,10],[11,14] 然后发现,定义一个r[l]表示l最远能到达的没有确定过的边界。 然后这个一定是连续的,就是比r[l]小的他一定都是没用过的,比r[l
阅读全文
摘要: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+
阅读全文
摘要:problem 一个长度为n的数组a,两个人轮流取,想让自己的拿的总和尽量大,都有最优策略,问有几种拿取的方案数。 solution 赛场上做出来了,现在会看又不会了。 先手和后手的最后拿的棋子是定的。 当最大的数出现了奇数次,先手必须要拿这个最大的,不然的话,本来是先手拿x+1个,后手拿x个,现在
阅读全文
摘要:problem 给你一个n<=16的图,求所有生成子图的最小生成森林边权之和。 solution 按照边权枚举每条边的贡献。 考虑[1,i-1]的边权和[i+1,m]的边权。 后者的边权可以随便拿, 考虑前者,当一个子图的u和v已经联通了,就是没有贡献的,其他的情况则都会有贡献
阅读全文