「解题报告」PJudge NOIP Round #5

要春季赛了,我要寄了。

所以做做联赛题吧。

link

青鱼和序列

容易发现最后的和一定是当前所有数的和的固定倍加上一些正着或者反着的答案。

然后发现如果你进行了一次操作 2,那么正着的数量与反着的数量相等,此时你进行哪个操作都会保持这个性质,这也意味着最后的和只有两种情况,两种取 max 即可。

青鱼和怪兽

[ARC016D] 軍艦ゲーム 的弱化版,做法一模一样。

写出 DP:fi,j 表示玩家血量为 i,怪物血量为 j 时的期望步数。容易写出 DP 式子:

f0,i=fn,mfi,0=0fi,j=min{p fi,j1+(1p)fi1,j,fn,m}

有环还有 min,这啥玩意。

我们改写一下 DP:将 fn,m 换成 x,那么有:

f0,i=xfi,0=0fi,j=min{p fi,j1+(1p)fi1,j,x}

然后假如你将 fi,jx 求导数,发现如果不考虑不考虑不可导的位置,导数一定在 [0,1] 内(容易归纳法证明)。那么 fn,mx 的导数就是在 [1,0] 内,也就是说 fn,mx 是单调递减的。而显然答案的 fn,m 肯定要等于 x,那么我们就可以二分这个 x 了。

青鱼和区间

一开始思路是对的,但是没考虑清楚。

Si 为覆盖 i 的线段的集合,那么题目的条件就是让 Si 互不相等。

互不相等很不好求,考虑容斥,那么就是考虑将总方案数减去有一些 Si 相等的情况。

一开始我的想法是将相邻的相等的位置合并成一个数,但是发现可能不相邻,然后炸了。

实际上想一想可以发现,假如有若干 Si 相等的位置,假如我们从第一个位置和最后一个位置将这一段数划分开,那么发现所有的区间要不然没有交,要不然包含这一整段,要不然完全包含在这一段内。而我们可以从左往右,每次选取极大的一块 Si 相等的位置,就能将整个序列划分成若干块。那么我们就可以把每一段看做一个数,这段里面的线段可以随便选取,而包含整段的线段实际上就是我们要求的问题,就能递归下去了。

ci=2(i+12),即从一段长为 x 的区间中任意选取若干线段的方案数。那么对于划分出的一段长为 i 的区间,内部的方案数就是 ci2

fii 个数使得两两 Si 不相等的方案数,gi,j 表示将 i 个数划分成 j 段的方案数(包括内部选取的方案),那么就有转移 fi=cij=1n1gi,jfjgi,j 容易 DP 求出,复杂度 O(n3)

可以 GF 刻画,然后拉格朗日反演得出 O(nlogn) 做法。我懒得整。

青鱼和游戏

不会,咕了。

posted @   APJifengc  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示