CF1932 Codeforces Round 927 (Div. 3)

E.Final Countdown

我愿称之为今年最傻逼的一次,思路很快想出来了,但是实现一直搞不对

观察发现答案是n的所有前i位数相加(如12345,那么ans=12345+1234+123+12+1)

要证明的话就是按照题目的Note那样算,(以12345为例,ans=(12345-1234-123-12-1)+21234+2123+212+21)

然后傻逼的事情就来了,这个n的位数是比较大的,我就想用高精度,然后梭哈,然后T..

把12345+1234+123+12+1用竖式列出来就很容易发现怎么做了.从后往前按每一位算就好了.

最终在还有六分钟结束的时候想出来,应该按每一位算,结果nm写按位算的时候写了bug.应该是jw = (ans+jw)/10,当时写的jw = ans/10.我怎么这么傻逼.

F.Feed Cats

比赛时这题完全没思路,赛后看b站解法是dp

当前状态和之前的状态容易转移.

记dp[i]是在位置i处放猫粮能喂养猫的最大数量.那么dp[i] = max(dp[j]) + w[i].其中 j < i 且需要满足条件:
j需要小于 所有那些包含点i的区间的左端点 (这样才能保证我们选点i时不会与以前的冲突)

那么如何得到包含点i的区间的最左端点?

我们可以直接从左向右遍历,当进入到一个区间的左端点时把左端点加入,当离开区间右端点时把左端点删除.
由于n比较小(1e6),所以我们可以直接记录m个区间在1~n这些点上的起始点和结束点,in[i]表示点i处的左端点们(是一个vector),out[i]表示以点i处的为右端点的区间的左端点(也是一个vector)

然后从左到右遍历点,把点i处若有左端点则加入,到了右端点就把那个左端点移除.

posted @ 2024-02-26 19:33  LZH_03  阅读(13)  评论(0编辑  收藏  举报