CF 乱写 2

这一部分是自己挑着难度做过的CF题

CF 911C

显然合法方案就这么几种:
$[1,x,y],[2,2,x],[2,4,4],[3,3,3],x,y\in N^* $

CF870C

这个题观察样例,可以大致知道拆成的\(4\)越多越好
因为\(4\)是最小的合数,
如果你以别的合数拆\(N\)的话,
\(\forall x, \frac{N}{x}\leq\frac{N}{4}\),其中\(x\)为合数
所以答案首先是要加上一个\(\frac{N}{4}\)
但是有这样一个问题就是有些数直接拆成\(4\)是会剩下不是合数的东西的
分类讨论:
1.\(n\equiv 2\pmod 4\) 这个时候把一个\(4\)换成\(6\)即可,答案不变
2.\(n\equiv 1\pmod 4\)这个时候最优方案是把两个\(4\)换成一个\(9\),答案减一
3.\(n\equiv 3\pmod 3\)这个时候把三个\(4\)换成一个\(6\)一个\(9\),答案减一
处理不会被分解的:
\(1,2,3\)样例交代了,\(5\)不满足方案\(1\),\(7,11\)不满足方案三

CF601A

建图最短路即可

CF577B

模拟赛撞题了
首先考虑\(n\geq m\)的情况,
这个就是鸽巢原理显然有解的应用
再考虑\(n<m\)的情况
这个时候就是背包问题一个经典模型了

但是,没有输出方案爷直接std::map水过去没问题吧

CF91B

不太理解线段树咋写的,于是就想了分块
对于\(i,\exist j>i,a_j<a_i\)
它的充要条件就是\(min(a_j) <a_i,j\in [i+1,n]\)
于是我们分块求出每块的最小值
对于每个\(i\),从后往前扫每一个块
如果当前块的最小值\(min<a_i\),那么\(\exist j,j>i\and a_j<a_i\)
直接在此块中查询符合条件的值即可
因为求的是\(max(j-i-1)\),所以块内遍历也是倒着扫

CF75C

首先就是如果\(x|a\and x|b\),那么\(x|gcd(a,b)\)
然后就预处理出所有\(gcd(a,b)\)的约数
查询时使用std::lower_bound即可
但是由于\(q=1e4\),所以直接暴力找也是可行的

CF994B

就是直接开贪就好了
首先按能力值升序排序
然后建一个关于钱的小根堆维护下最优的\(k\)个决策
再来变量记录这些最优决策的总和
然后把自己入堆即可

CF991C

二分答案
单调性就是如果你一天吃\(now\)个是合法的,那么:
对于每一个\(mid\geq now\),一天吃\(mid\)个显然还是合法的
所以合法解方向是\(r\),更优解方向是\(l\)
然后就是check()函数的问题
注意到还有一个人他吃糖果的数量是每天的\(10\%\)
这样的话,直接暴力模拟的时间复杂度就变成了对数级
经计算:\(n=1e18\)的时候,暴力模拟的循环次数最多进行约\(350\)
所以直接暴力模拟检查是否合法即可
注意check()写法返回值问题

posted @ 2022-08-06 08:56  2K22  阅读(33)  评论(0)    收藏  举报