7月12日模拟赛总结

here.

T1 最大子段和。

T2 一开始没看到 \(a_i\) 有负数,人机本性暴露无遗。

\(dp_{i,0/1}\) 表示前 \(i\) 个书包且总和为奇数(1)或偶数(0)的最大值。初始 \(dp_{0,1}=-\infty\)(非法) 其余全 0。答案 \(dp_{n,0}\)。转移 显然是考虑选或不选 \(a_i\)\(dp_{i,j}=\max(dp_{i-1,j},dp_{i-1,j \oplus (a_i \bmod 2)})\) 即可。

T3 令 \(dp_{u,0/1/2}\) 表示节点 \(u\) 当前父亲看守/自己看守/儿子看守。

\(dp_{u,0}\) 时,儿子需要被看守,而它们的父亲无人看守,所以要从 \(dp_{v,2}\) 转移。

\(dp_{u,1}\),则先得加上自己的代价,然后儿子怎么搞都行,在 \(dp_{v,0/1/2}\) 里边取一个 \(\min\) 即可。

\(dp_{u,2}\),儿子只需要一个是 \(dp_{v,1}\) 就可以了,其他的都可以是 \(dp_{v,2}\)。为了解决这个问题,我们需要记录一个 \(\min\{dp_{v,1}-dp_{v,2}\}\),以便儿子没有一个 \(dp_{v,1}\) 时及时进行修正。

答案当然是 \(\min(dp_{1,1},dp_{1,2})\)(1 没有父亲)。

T4 比较硬核。

删边是困难的,考虑换成加边做。

\(dp_{u,0/1,0/1}\) 表示当前 \(u\) 的连通块奇偶性为 \(0/1\),且目标奇偶性 \(0/1\) 时的方案数。

转移的时候可以连或不连 \(u,v\) 边,如果连起来的话就必须保证奇偶性符合被更新的状态的要求,并且用乘法原理累加方案数即可,具体如下:

nowans[0][0]=(nowans[0][0]+dp[cur][0][0]*dp[i][0][0])%MOD;
nowans[0][0]=(nowans[0][0]+dp[cur][0][1]*dp[i][0][1])%MOD;
nowans[0][0]=(nowans[0][0]+dp[cur][0][0]*dp[i][0][0])%MOD;
		
nowans[0][1]=(nowans[0][1]+dp[cur][0][0]*dp[i][0][1])%MOD;
nowans[0][1]=(nowans[0][1]+dp[cur][0][1]*dp[i][0][0])%MOD;
nowans[0][1]=(nowans[0][1]+dp[cur][0][1]*dp[i][0][0])%MOD;
		
nowans[1][0]=(nowans[1][0]+dp[cur][1][0]*dp[i][1][0])%MOD;
nowans[1][0]=(nowans[1][0]+dp[cur][1][1]*dp[i][1][1])%MOD;
nowans[1][0]=(nowans[1][0]+dp[cur][1][0]*dp[i][1][1])%MOD;
		
nowans[1][1]=(nowans[1][1]+dp[cur][1][0]*dp[i][1][1])%MOD;
nowans[1][1]=(nowans[1][1]+dp[cur][1][1]*dp[i][1][0])%MOD;
nowans[1][1]=(nowans[1][1]+dp[cur][1][1]*dp[i][1][1])%MOD;

其中,nowans[][] 是答案寄存数组,可以理解为 dp[cur][][]。至于为什么需要这个东西,是为了防止 dp 数组被提前更新导致答案错误。

成绩:100+10+0+15=125,rk2。炸了。

总结:

dp 这块我不是很熟,要多练。/fendou

  • dp 四要素:状态、初始、答案、转移。逐一考虑清楚再写代码。

  • 状态和转移的设计要将情况讨论完整。

posted @ 2025-07-13 22:57  _KidA  阅读(6)  评论(0)    收藏  举报