随笔分类 - ACM
大二到大三不堪回首的记忆....
摘要:原题链接 考察:数位dp 这个用循环没想出来怎么写,反倒是dfs写法很容易理解(.),菜是原罪,如果有循环预处理写法请告诉本蒟蒻QAQ. 思路: 参考数位dp记搜模板.dfs带四个变量: LL dfs(int pos,int sum,int mid,bool limit) /*分别是枚举到第几位,平
阅读全文
摘要:原题链接 考察:数位dp 思路: 入门题(然后做了一个小时) 这里预处理方案数是用组合数.如果我们直接套模板会发现答案不对,因为我们不同数字的二进制位数不同,前导零不应该被计入. 先算出n有的二进制位数符合条件个数,然后再计算二进制位数比n小的即可. ##Code #include <iostrea
阅读全文
摘要:原题链接 考察:数位dp 思路: 只从看了那道CF55D题我数位dp越写越懵(.) 这道题用容斥原理写的,有正常的循环写法: GO 要注意求的数不同,最后判断条件也不同. Code #include <iostream> #include <cstring> #include <vector> us
阅读全文
摘要:原题链接 考察:数位dp 思路: 应该是入门题,但我WA了两次....这道题直接求连续的49反而不大好求,我们反过来求不连续49的个数,然后再减去即可. ##Code #include <iostream> #include <cstring> #include <vector> using nam
阅读全文
摘要:原题链接 考察:贪心+思维 思路: 将所有数字化为k*p+b,每次优先队列更新最大值,都会将最大值的k压为次大值的k.我们从大到小遍历,求解k次操作后,最大值的k,已经确定最大值所在位置idx. 求完之后,k可能有多.需要将idxn 之间的数再均摊k.但是注意它们只能均摊idxn长度的k.剩下的k,
阅读全文
摘要:原题链接 考察:贪心 这题不难,但是本蒟蒻是fw.主要是没分析出点的性质,发现了点的个数很少后没啥反应(.) 思路: 注意到点的坐标是倍增增长的,根据起始坐标的范围,最大能运动到(2*1016,2*1016)处.a最小是2,因此最多是60个点. 接下来就没想到了,因为点坐标是倍增增大的,因此1~i的
阅读全文
摘要:原题链接 考察:数位dp 思路: 预处理时,不计入每位数字为4或首位为6,次位为2的数字. 但是注意计算左分支的时候,我们是ans+=f[i+1][枚举的数字],如果枚举的数字为2,实际还需特判上一位.因为预处理首位数字为2时没有考虑上一位是什么. Code #include <iostream>
阅读全文
摘要:原题链接 考察:博弈论 思路有点跳跃,反正我是没想到() 思路: 我们发现操作1:石子数-1. 操作2:堆数-1.每次操作都变化的堆数+石子数的和的奇偶性.而堆数+石子数-1 = 能操作的最大次数. 再发现当堆数 = 1,石子数 = 1是必经局面,先手必胜.堆数+石子数-1为奇.如果某个局面先手必胜
阅读全文
摘要:原题链接 考察:构造+贪心 思路: 最小值很容易想,如果叶子结点之间的距离都为偶数,那么minv = 1.如果存在一个奇数那么minv = 3. 最大值本蒟蒻没想到,实际上只要两个叶子结点之间距离==2,那么这两个叶子结点之间必同权值.如果dist>2,那么一方可选择的值就很多,必然不会相同.这个不
阅读全文
摘要:原题链接 考察:博弈论 思路: 这道题像上题一样解释阶梯博弈会发现行不通,因为0位置可以被多个点占据,而上题所有位置都是一个棋子. 那么怎么解呢?博弈论的快速解法就是去找必败态.我们可以发现: 先手只能移动一组里左边的石子,如果k在组里的第二个,那么先手必败. 如果k在组里的第一个呢? 接下来讨论n
阅读全文
摘要:原题链接 考察:博弈论 思路: 看了大佬题解才发现是阶梯博弈,这里讲一下为什么是阶梯博弈. 以第二个样例: 1 5 6 7 9 12 14 17 我们计算出每个人可以移动的距离数组b:0 3 0 0 1 2 1 2 假设我们把第二个人往左移动2格,该数列变成:0 1 2 0 1 2 1 2 有没有发
阅读全文
摘要:原题链接 考察:博弈论 思路: 威佐夫博弈,求先手必胜的第一步. 要先手必胜,即把后手面临的局面改为先手必败.当n==(m-n)*k即先手必败.这里分两种情况: (m-n)*kd,d<n时,我们可以从n堆里取,但我们需要保证新局面下m,与n的差值不变,才能保证差值*kn 从m堆里取,此时m堆的值不可
阅读全文
摘要:原题链接 考察:博弈论 参考大佬的对称博弈,本蒟蒻是没推出来. 思路: 先来看没有成环的情况. n为奇,先手去掉中间的石子,随后后手不管选什么都破坏平衡,先手对称选哪些,因此平衡局面0 0必然被先手遇到. n为偶,先手去掉中间两个石子,随后又形成了平衡局面.由上面先手又必胜.但是如果k==1,则先手
阅读全文
摘要:原题链接 考察:贪心+栈 本蒟蒻的思路: 检查"NO":计算每次-操作的价格最大值与最小值,如果不在此范围输出NO. 当时想出的赋值方式是while存储所有可能取值,这时间复杂度最坏O(n2).而且这种思路也比较麻烦,计算最大值与最小值也需要while处理. 参考大佬的思路: 检查NO不是通过范围取
阅读全文
摘要:原题链接 题意:求构造c[k] = b[i]-a[j],求(最大差值-最小差值)的最小值 考察:双指针 错误思路: 排序b,a.输出b[n]-a[n]-b[1]+a[1].实际上最大差值不一定由b[n]构成,最小差值不一定由b[1]构成.如果b数组都相同,最大差值和最小差值可以是同一个数. 正确思路
阅读全文
摘要:原题链接 考察:构造 思路: 这题的构造应该很简单吧....两两构造即可.本蒟蒻想到了正确思路但被我否了!!!我是彩笔WA两次!!!! Code #include <iostream> #include <cstring> #include <algorithm> using namespace s
阅读全文
摘要:原题链接 考察:博弈论 思路: 这题不会只能说明对sg函数理解不够透彻了(比如我. 明确sg函数是解决所有ICG游戏的通解,而本题很明显是ICG游戏(所有执行步骤与执行者无关). 那么所有面朝上的硬币都可以视为一个起点.以下标为0的面朝上硬币为例,那么sg(0) = 1.由此也可以推到sg(1) =
阅读全文
摘要:原题链接 考察:博弈论 思路: 发现这种n比较大的,比较难找胜态和败态.像上题一样考虑sg函数打表,但是本题的石子移动是可以移动到其他堆的,本蒟蒻是不会写本题的sg函数(). 这样只能研究A,B的移动方式了,实际有点类似阶梯博弈,可以发现(A+B)%6==3时可以移动A >B.此时枚举0~5之间的数
阅读全文
摘要:原题链接 考察:博弈论 看了其他题解都是不难发现...,果然是我太弱了(.) 思路: 这题不是打表胜负态,而是打表sg函数.可以发现4个一循环. Code #include <iostream> using namespace std; int n; int main() { int T; scan
阅读全文

浙公网安备 33010602011771号