tg 72 solution
tg 72 solution
T1
T1,DP
估计所有人都可以推出来
但是,推出来的和值域有关吧?
我就知道死在这里的不止我一个
发现,由于这个\(x=\leftarrow \lfloor\frac{x}{2}\rfloor\) 的操作
事实上,可以用到的状态数\(O(n\log x)\)
证明考虑可达到的数范围关于操作1
次数的变化
于是把DP
改成记搜/DP
加std::map<>
就可以过了
注意,如果记搜\(90\space pts\),考虑
\(1.\)放弃std::map/unordered_map<>
手写哈希表
\(2.\)放弃记搜,改用DP+std::unordered_map<>
加上滚动
3.
放弃改形式,特判过
看到题解按着暴力思路定义然后用
T2
做这个题,你需要知道:
首先,看好返回的先后顺序,因为这个东西,我改题异常艰难
其次,会做交互题
有关约数这种东西,首先想到
\(\sigma(n)\leq n\)
(还有就是,这个函数上界\(\sqrt{n}\),很松)
于是我们发现,分解成\(n\)个\(1\)才是最优方案
因为\(\sigma(1)=1,\forall x.\sigma(x)\leq x=x*\sigma(1)\)
所以上述方案一定不劣
考虑最小值
首先需要知道哥德巴赫猜想
(这个没有证明,但是现在计算机已经通过验证表明这个范围的数满足哥猜成立)
通过形式\(1\)我们知道最优答案上界是\(5\)
通过形式\(2\)我们可以给出\(3/4\)的偶数构造
然后选择大力分讨,记\(prime\)为素数集合
\(1.n=1\or n\in prime\)
这个时候不用分拆
\(2.2|n\)
首先,我们看\(n-1\)
如果\(n-1\in prime,\)使用\(\{1,n-1\}\)即可构造最优解,为\(3\)
否则,通过\(1+1\)的形式,我们可以构造出一个\(4\)的最优解
事实上似乎较小的那个质数非常小,枚举到\(1e3\)左右即可找到合法解
\(3.2\not | n\)
我们可以通过\(1+2\)构造一个\(5\)的解
但是这个解可能不够优,
我们考虑不做拆分的情况即可
构造考虑先减掉一个\(1\)
然后奇数的情况就转换成偶数的情况了
然后按照继续分类讨论就结束了
似乎我原来的构造方式有问题就扔掉了
T3
T4
复述题解时间
\(k\to k+1\)的最优集合转变,必然是这样的:
\(1.\)新开一段
\(2.\)延长一段的两端
证明考虑KM
算法证明过程
由于本人不会KM
所以请看题解
于是我们维护这个贪心需要的东西
第一个是std::set<>
维护连续段,第二个std::priority_queue<>
维护最优决策
显然两个时间复杂度都是\(O(n\log n)\)