10.31
Posted hzoi2018-xuefeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10.31相关的知识,希望对你有一定的参考价值。
加油(话说为什么前段时间天天改不完题无法颓博客考的贼烂,现在天天改题稍快颓博客成绩上升)
A. 简单计算
首先,看到向下取整我们想到了整除分块....
正解:考虑如何计算
很容易的可以想到,我们的=$(i*q-i*q\\% p)/p$
那么我们的就等价于$(i*q-i*q\\% p)/p$
通过一番愉悦的打表,我们发现$(i*q\\% p)$有着一个奇妙的循环节。
并且发现:循环节长度就是$p/gcd$,循环节个数就是$gcd$。
既然这样那么O(1)柿子就可以推了。
核心代码:
d为gcd(p,q)
B. 格式化
首先考虑a<b的情况,因为每次我们取这样的物品得到的物品一定是更多的。
那么我们只需要让最开始我们借的容量越少越好,后面的不够再添的话也不会使答案更劣的。
即按照a升序。
其次我们考虑a>b的情况,考虑如何证明按照b降序是正确且最优的。
我们设1在2前面更优,那么设rem表示当前剩余的容量,设cost表示b-a即我们添这个物品能得到的贡献,设st表示a。
那么如果1在2前面更优,考虑一种极端情况,即1可以在2前面,然而2在1前不可以。
即$$rem+cost_1>=st_2 rem+cost_2<st_1$$
$$rem>=st_2-cost_1 rem<st_1-cost_2$$
$$st_2-cost_1<=rem<st_1-cost_2$$
$$st_1+cost_1>st_2+cost_2$$
那么st+cost不就是b吗?
核心代码:
C. 真相
首先我们可以考虑一种特殊情况:没有第一种人,即咩有”$“
那么我们可以发现,对于所有人的关系已经确定,也就是说我们给最后一个人一个属性:说真话/谎话
那么我们就可以通过递推的形式把所有人说真话/谎话确定,知道最后我们判断戳来第一个人说真话/谎话,那么与最后一个人对第一个人的意淫做比较就可以得到是否矛盾。
现在考虑有“¥”的情况。
如果有$的话,那么我们发现最后就不会是一个环?的形式了,而是很多条被$拦腰“桀”断的链式结构,我们想要让这些链式结构在同一种情况下成立。
发现:同一种情况下只会有一种情况的K成立。
其实吧,这样的话我们可以清楚的知道,一定有很多条链的末尾的‘$‘是谎话。
那么我们可以递推预处理出来K相同的链在$是真话的前提下说真话的人数和说谎话的人数。
然后枚举是哪个K是真话,然后判断说真话的人数是否等于K。
这个可以O1判断,就是用所有¥都说谎话时候的说真话的人数(可以直接预处理)-这个K说真话时说谎话的人数(就是等价于这个K说谎话的时候说真话的人数)+这个K说真话时说真话的人数即可。
核心代码:
以上是关于10.31的主要内容,如果未能解决你的问题,请参考以下文章