随笔分类 - cf
摘要:458C - Elections 思路: 三分凹形函数极小值域 代码:
阅读全文
摘要:934D - A Determined Cleanup 思路: 找规律,和k进制的求法差不多,答案的奇数位是p%k,偶数位如果p%k!=0,那么答案是k-p%k,否则为0。 代码:
阅读全文
摘要:934C - A Twisty Movement 思路:dp 很容易想到要预处理出1的前缀和pre[i]和2的后缀和suf[i] 然后枚举区间,对于每个区间如果能求出最长递减序列的长度,那么就能更新答案了 这个用dp求 状态: dp[i][j][0]表示i--j区间以2结尾的最长递减序列长度,很明显
阅读全文
摘要:36B - Fractal 思路:分形 代码:
阅读全文
摘要:374C - Inna and Dima 思路:dfs+记忆化搜索 代码:
阅读全文
摘要:E - Connected Components? 思路: 补图bfs,将未访问的点存进set里 代码:
阅读全文
摘要:920G - List Of Integers 思路:容斥+二分 代码:
阅读全文
摘要:2B - The least round way 思路: dp。 先算出每个数2因子的个数,和5因子的个数 因为要出现0那么要1个2乘1个5,那么最后的答案是min(2的个数,5的个数) 所以我们可以分开考虑,先算出使2最小的方案,再算出使5最小的方案,然后再取最小就可以了。 注意特判一种情况,如果
阅读全文
摘要:920F - SUM and REPLACE 思路1: 线段树(982 ms) 每个点最多更新6次 代码: 思路2: 分块(1326 ms) 每个块最多更新6次 代码:
阅读全文
摘要:859C - Pie Rules 思路: dp 我们知道无论谁拿到decider token他拿不拿蛋糕都是确定的,都是使自己最优的结果。 于是 定义状态:dp[i]表示到第i个位置拿到decider token的人能使自己拿到的最大的值 初始状态:dp[n]=a[n] 目标状态:dp[1] 状态转
阅读全文
摘要:919E - Congruence Equation 思路: 费马小定理。 n*a^n = b (mod p) 根据费马小定理 a^(p-1) = 1 (mod p) 我们把n化为 n=i+y(p-1) 于是[i+y(p-1)]*a^ [i+y(p-1)] = b (mod p) 再根据费马小定理a
阅读全文
摘要:919D - Substring 思路: 拓扑排序判环+DAG上dp+记忆化搜索 状态:dp[i][j]表示以i为起点的路径中j的最大出现次数 初始状态:dp[i][j]=1(i have no son && w[i]==j) dp[i][j]=0(i have no son && w[i]!=j)
阅读全文
摘要:918D - MADMAX 思路: dp+记忆化搜索 状态:dp[i][j][w]表示先手在i节点,后手在j节点,这一轮的字母为w的结果,如果为true,则表示先手必赢,否则后手必赢。 状态转移:如果i连的一条边的权值tw>=w,连向t,那么这个博弈的结果可以由dp[j][t][tw]决定,如果dp
阅读全文
摘要:918C - The Monster 思路1: 右键在新窗口打开图片 代码: 思路2: 结论: 证明见codeforces.com/blog/entry/57420 代码:
阅读全文
摘要:454D - Little Pony and Harmony Chest 思路: 状压dp,由于1的时候肯定满足题意,而ai最大是30,所以只要大于等于59都可以用1替换,所以答案在1到59之间 然后筛出1到58之间的质数,只有16个,把1到58的数的状态由这16个质数表示,如果整除这个质数则二进制
阅读全文
摘要:454C - Little Pony and Expected Maximum 思路: m面的骰子掷n次,总共有m^n种情况,如果一种情况的最大值是m,那么它肯定包含m,那我们在所有情况下挖掉不包含m的情况:(m-1)^n,所以最大值是m的情况数是m^n-(m-1)^n,同理可得最大值是m-1的情况
阅读全文
摘要:D - The Child and Zoo 思路: 并查集+贪心 每条边的权值可以用min(a[u],a[v])来表示,然后按边的权值从大到小排序 然后用并查集从大的边开始合并,因为你要合并的这两个联通块之间的点肯定要经过这条边,而这条要合并的边是所有已经合并中的最小的,所以两个联通块之间的所有点之
阅读全文
摘要:URAL 1635 思路:区间dp+贪心,先n^2处理出每段区间是否是回文串,然后贪心地找每一段1到i的最少分割。 代码:
阅读全文
摘要:912E - Prime Gift 思路: 折半枚举+二分check 将素数分成两个集合(最好按奇偶位置来,保证两集合个数相近),这样每个集合枚举出来的小于1e18的积个数小于1e6。 然后二分答案,check时枚举其中一个集合,然后找到另外一个集合小于mid/该元素的元素有多少个,这里用到一个双指
阅读全文
摘要:911E - Stack Sorting 思路: 用栈来模拟,能pop就pop,记下一个需要pop的数为temp,那么如果栈非空,栈顶肯定大于temp,那么加入栈 栈顶值-1 到 temp 的值,否则加入栈 n 到 temp 的值,如果需要加入的数之前已经出现过,答案则不存在。 代码:
阅读全文