2017/9/15 离线赛

来源:互联网 发布:java 缺省构造函数 编辑:程序博客网 时间:2024/05/13 21:44

好久没有写离线赛的总结了……自从前几次遇到很难理解的题目就没写了,现在开始重操旧业吧。不过,现在不想像以前一样写那么详细的解释了,就写写简单的总结吧。

T1 最长不下降子序列

    n这么大,很容易发现整个序列存在循环,因为同一个数经过一次计算得到的数是一定的,而且D只有150,所以循环节最长不超过150个数。于是整个序列就被分成了三部分,最前端不在循环节里的部分,中间超多个循环节,以及末尾一个不完整的循环节。对于两个循环节之间的答案转移,无非是使序列保持不变或者增加,假如是增加的话一定是在后来增加。考试的时候就想到这,然后因为没多想,代码敲得很复杂,就判了一下最后一个循环节是增还是不变,于是就WA了。实际上只要一个BIT就能解决一切了。

T2 完全背包问题

    这道题考试的时候看到W这么大我就很懵,现在要长个心眼了,看到数很大的时候要想到取模啊,就跟第一题一样,虽然n很大,但是全是循环的,可以一起考虑。这里,我们只要找一个权值最小的物品,设它的权值为P,那么要询问W,只要知道是否存在W%P的方案即可。然后可以设dp[i][j][k]表示前i个物品,j个大体积物品,达到的权值modP等于k的最小权值和。可以写出两条转移方程,一条是用来转移小体积物品的,另一条是用来转移大体积物品的,我们发现大体积物品可以直接由枚举过来的状态表示,而小物品则不行,因为小物品是在同一个j下转移的,所以要建图,跑一边最短路就OK了。

T3 最近公共祖先

    考试的时候没多想,就敲了个线段树拿40分,然后线段树敲错了(update的时候当查询区间和当前区间相符时直接return结果我打成了落到根节点才return,鬼知道我在想什么),结果只有20分。最后发现,正解跟我的代码就差了几行。

    当时就直接冲着黑点对答案的贡献来想,然后只要从黑点往上跳,用当前点的权值更新除from的子树外的所有当前点的子树中点即可。对于一个点,它最多只要更新两次,两次从不同儿子走来的方法,当这个点被更新过了说明它到根节点的路径上的点已经都被更新过了,直接break就行了。

    且不说这次的题目难不难,从我犯的这些小错误就足以见得我是多么ZZ,第二题爆零,原因是把Yes输出成YES了,这是之前有人犯过的错误,而我自己没犯,也没太在意;第三题线段树敲爆了。。。以后考试的时候要注意了!