Loading

[AGC041D] Problem Scores

挑战全网最丑做法,这个做法甚至不需要注意到只关心 \(k=\lfloor\frac n 2\rfloor\) 的情况。

我们考虑刻画条件,显然所谓的 \(S\) 只会选到后缀,所谓的 \(T\) 只会选到前缀。一个限制的能力太小,我们考虑所有限制在一起能给我们带来什么信息,或者说便于做题的额外性质。

考虑限制之间的关系。首先 \(a_1>0\),虽然 \(k>0\),但是我们不妨增加一个这样的限制。然后 \(a_1+a_2>a_n\),然后 \(a_1+a_2+a_3>a_n+a_{n-1}\)。。。我们把式子移项,第二个限制为 \(a_1-(a_n-a_2)>0\),第三个限制为 \(a_1-(a_n-a_2)-(a_{n-1}-a_3)\)。。。我们发现,现在我们需要满足的是有一个正整数 \(x\),初值为 \(a_1\),然后我们要减去后缀和前缀对应位置的差,最后需要满足的是 \(x\) 大于零。其实这里就已经完全可以注意到只需要关心 \(k=\lfloor \frac n2\rfloor\) 的情况了,但是我选择直接做。

我们现在的当务之急是解决给一个合法的差值序列问能还原出多少个原序列。我们发现第 \(i\) 对数的取值范围只与前一个位置和当前位置的差值有关。那么我们不妨设 \(f(i,j,k)\) 表示现在放了 \(i\) 对数,\(x=j\),上一个的差值为 \(k\) 的方案数。直接转移是 \(\mathcal{O}(n^4)\) 的,但是首先我们可以后缀和优化做到 \(\mathcal{O}(n^3)\),然后我们发现由于我们需要限制差值单调递减,那么状态数实际上并没有很多,因为我们需要满足 \(ik\le n-j\),所以总状态数是 \(\mathcal{O}(n^2\ln n)\) 的,卡卡常就过了。

由于正解太美了,所以我决定附带正解做法。

这种多个限制的题目很有可能只有寥寥几个限制有用,我们应该注意到既然 \(S\) 选后缀 \(T\) 选前缀,那么限制是要越来越强的,因为 \(S\) 加的越来越少,\(T\) 加的越来越多。直接注意到这个性质是很有难度的,但是如果我们知道有的题可以简化限制那么注意到它并非难事。

然后就是考虑单调递增该怎么做。对于单调递增的计数我们有一种套路就是先钦定所有位置都是最大值,本题中就是令 \(a_i=n\),然后每次操作就是减一段前缀。由于操作类似线性,那么对于前 \(k\) 个数减去后 \(k+1\) 个数的差值的影响也是简单的,并且每个操作带来的影响都是负贡献且无论如何都一样,于是该问题可以变成一个完全背包问题。代码。

要想到这道题的正解主要是需要注意力或是一些套路,比如说简化限制,减去一段前缀,然后只需要自然地分析影响就能够推出这是一个完全背包问题。

posted @ 2025-09-30 15:08  lalaouye  阅读(11)  评论(0)    收藏  举报