随笔分类 - CODEFORCES
摘要:首先我们可以假设最后一个删除的peg编号是x,那么可以发现每个编号结尾的方案数是一样的,可以只专注计算最后删1号peg的方案数,然后乘一下就好 然对于1来说,我们需要找到一个(x, y) 的组合,x和y之间允许剩pegs,但是1到x,以及y到1之间的pegs都被移除,这个状态在此时依然没有触碰blu
阅读全文
摘要:可以推出 min[i]要么是i要么是1,当a序列中存在这个数是1 max[i]的话就比较麻烦了 首先对于i来说,如果还没有被提到第一位的话,他的max可由他后面的这部分序列中 j =i 的不同数多少所决定,这个可以用树状数组解决 其次就是两次被提到第一位的中间的空当,这个空当中不同的数的大小,也会决
阅读全文
摘要:这题写起来真的有点麻烦,按照官方题解的写法 先建图,然后求强连通分量,然后判断掉不符合条件的换 最后做dp转移即可 虽然看起来复杂度很高,但是n只有15,所以问题不大
阅读全文
摘要:这题是一个贼搞人的线段树 线段树维护的是 区间和a[i j] 首先对于update的位置可以二分查找 其次update时候的lazy比较技巧 比如更新的是 l r段,增加的是c 那么这段的值为: a[l] + c, a[l + 1] + k[l] + c, .... a[r] + k[l] + ..
阅读全文
摘要:非常经典的dp题,因为1至8的最大公约数是840,任何一个数的和中840的倍数都是可以放在一起算的, 所以我只需要统计840 8的值(每个数字(1 8)的sum%840的总和),剩下都是840的倍数 dp[i][j] 代表讨论了第i位并且每个数字取余为j的情况
阅读全文
摘要:应该是我做过最复杂的数位dp了 做之前已经忘了数位dp是啥了,找了一个博客复习下 然后这题不同的是求的是和,而不是个数 所以需要维护更多的元素 dp[i][j]val, count, remain 代表讨论到i位置,已经有mask(j) (0 9分别2进制表示)时他的剩下位数的总值,计数,以及前面全
阅读全文
摘要:从(1,1,n,n)每次只变一个坐标,进行询问。 如果问到对角线有距离限制, 再从(1,1,n/2,n/2)询问到(n/2,n/2,n,n) 记住前半部分贪心忘上走,后本部分贪心往右走 因为最后的路线可能有多条 所以这样走的话一定能找到一条对角线在右上角的路线 c++ include include
阅读全文
摘要:从最大的数开始讨论 如果最大的数中间有断开的地方,那么就需要从0里面选,把他填上 需要使用树状数组 include include include include include include include include include include include include incl
阅读全文
摘要:有图可以直观发现,如果一开始的pair(1,1+n/2)和pair(x, x+n/2)大小关系不同 那么中间必然存在一个答案 简单总结就是大小关系不同,中间就有答案 所以就可以使用二分 include include include include include include include i
阅读全文
摘要:首先枚举Berland最后的得票数,然后根据这个得票数, 根据得票数,贪心的取价钱少的人: 首先 原票数 就比Berland预计票数的团队 需要票投到比Berland少1 如果Berland还是达到预计的票数,然后再贪心从其他人中取 c++ include include include inclu
阅读全文
摘要:这道题比赛之后被重新加了几个case,很多人现在都过不了了 算法就是先求凸包,然后判断两个凸包相等 我们可以吧凸包序列化为两点距离和角度 角度如果直接拿向量的叉积是不对的,,因为钝角和锐角的叉积有可能相同。我直接把点积和叉积加一起当作角度其实也不严谨,,最好是变成三个元素,长度,叉积,点积 代码有所
阅读全文
摘要:首先我们如果满足三缺一,那么必有同行和同列的点 如果两行有同列的数,我们可以设想,他们最后会全部填充成为两者啥都有的情况 显然这个是个并查集 现在我们有了很多集合,每个集合自己可以进行三缺一操作,但是集合有缺陷,集合里面的人都没有的列数,那就没法搞 可以贪心的想,一共k个集合的话,把k个集合连接起来
阅读全文
摘要:正常没有正方形的限制下,值为i的点个数4 i 那么从0开始遍历,第一个不为4 i的值就是min(x, y) 由于对称性我们姑且令x为这个值 我们先列举n m=t的各种情况 对于一对n, m。我们已经知道n,m,x 再由于对称性,我们假设距离(x,y)最远的点在(n, m)。(当然也可能在(1,m))
阅读全文
摘要:这个题是dp, dp[i]代表以i开始的符合要求的字符串数 j是我们列举出的i之后一个字符串的开始地址,这里的C是组合数 dp[i] += C(j i 1, A[i]] ) dp[j]; include include include include include include include
阅读全文
摘要:这道题的算法是: i从1开始,首先求sum(1 i),然后在[i+1, n]中找到第一个a[j] =sum(1, i) 如果a[j]==sum(1, i)结束搜索,否则令i=j,循环过程 因为每次做完一次之后sum会至少增大一倍,所以一个查询的复杂度会维持到log(Max(a[i])) 需要维护 区
阅读全文
摘要:首先达成一个共识,n为偶数,无法做到 因为n为偶数,最后奇数条边,和每次撕偶数条边不符合 n为奇数时,做dfs 首先一个除了root每个点都是奇数度的树,可以通过先序序列把这个树撕掉(这个自己脑补) 如果上述成立,那么我可以直接dfs,从离叶子最近的地方找这种树,并且把他撕掉 大概就像从叶子不断向上
阅读全文
摘要:首先0 k项可以直接求出 其次后面(n+1)/k组项其实构成了等比数列(比值是a^{ k}b^{k}) 那么此时还需考虑这个比值为1的特殊情况就行了(不仅a==b的时候这个比值会为1,因为取余,一些乱七八糟的情况也会造成比值为1) include include include include in
阅读全文
摘要:这道题我可以直接模拟 理由是一个数 2的过程中最多30次左右 2^31 = 2e9 所以我可以从小的书开始模拟这个过程
阅读全文
摘要:``` include include include include include include include include include include const int N = 1e5 + 5; struct fraction { long long num, deno; temp
阅读全文
摘要:首先可以前缀和 ans = solve(R) solve(L 1) 对于solve(x) 1 x当中符合条件的数 分两种情况 1. 3,5,7,9次方的数,注意这地方不能含有平方次 2. 平方数 c++ include include include include include std::vec
阅读全文

浙公网安备 33010602011771号