11.3 模拟赛

T1:

原题链接

T2:

原题链接

不难发现,设最终每段黑白比值为 \(C\),则 \(\frac{\sum W}{\sum B}=C\),我们可以直接算出每段的黑白格子比值为多少。

接下来考虑如何让划分区间最多:

  • 结论: 一定是恰好满足 \(\frac{W}{B}=C\) 的最小的区间。

  • 证明:\([1,x],[1,y]\) 区间均满足条件,且 \(x<y\),发现 \(\frac{W_{1,x}}{B_{1,x}}=\frac{W_{1,y}}{B_{1,y}}=\frac{W_{x+1,y}}{B_{x+1,y}}\),所以选 \([1,y]\) 不如选 \([1,x],[x+1,y]\),能产生更多贡献。

接下来模拟上述贪心过程即可。

T3:

原题链接

棋盘上放置方案问题,很容易想到动态规划求解,观察数据范围,无法状态压缩。

但再观察,发现某一列上最多只能放两个棋子,某一行也同理,所以我们可以这样设计状态:令 \(f_{i,j,k}\) 表示前 \(i\) 行,有 \(j\) 列放了一个棋子,\(k\) 列放了两个棋子的方案数。

转移时枚举第 \(i\) 行放了多少棋子:

  • 不放棋子,直接从上一行状态转移来:\(f_{i,j,k}=f_{i-1,j,k}\)

  • 放一枚棋子,它可以放到之前没有棋子的和有一枚棋子的列:\(f_{i,j,k}=\begin{cases}f_{i-1,j-1,k}\times (m-(j-1)-k)\\f_{i-1,j+1,k-1}\times (j+1) \end{cases}\)

  • 放两枚棋子,可以都放到没棋子的列,都放到放一枚棋子的列,以及分别放没棋子和有一枚棋子的列。
    转移方程为:\(f_{i,j,k}=\begin{cases}f_{i-1,j-2,k}\times C_{m-(j-2)-k}^{2} \\f_{i-1,j+2,k-2}\times C_{j+2}^{2}\\ f_{i-1,j,k-1}\times j\times (m-j-(k-1)) \end{cases}\)

最后答案为 \(\sum_{j=0}^{m}\sum_{k=0}^{m}f_{n,j,k}\)

T4:

原题链接

可以暴力枚举 \(a,b\),然后 \(c\in [2b-a,n]\),找区间最大值即可。

对于我们选择的 \(a,b\) 间,若能在 \((a,b)\) 中找到某个下标 \(i\),满足 \(h_i\ge h_a\)\(h_i\ge h_b\),那么选择 \(i\) 是更优的。

理由很简单,无论是从 \(a\to i\) 还是从 \(b\to i\),都会扩大 \(c\) 的选择区间,同时还能增大你的 \(h_a+h_b\)

所以我们只找满足以下条件的 \(a,b\)

  • \([a,b]\) 中最大值 \(< \min\{h_a,h_b\}\)

这不就是找到一个数,它左右两边的最近的大于等于它的数吗。直接单调栈求出,并且这样的数对是 \(O(n)\) 级别的。

然后我们把询问离线下来,从大到小枚举左端点进行扫描线,对于新的左端点 \(i\),先把预处理来的数对 \((a,b),a=i\) 对答案进行更新。

如何维护答案?考虑线段树,设 \(B_i\) 表示如果选 \(i\) 作为 \(c\),它左边的最大的 \(h_a+h_b\),对于新来的数对 \((a,b)\),将 \([2b-a,n]\) 中的 \(B_i\)\(h_a+h_b\)\(\max\),这个用线段树很好维护。

对于左端点为 \(i\) 的所有询问,查询区间 \([i+2,r]\)\(B_i+h_i\) 的最大值。

所以线段树维护 \(h_i,B_i+h_i\) 的最大值,支持与某个数取 \(\max\) 操作,这道题就做完了。

时间复杂度 \(O((n+q)logn)\)

posted @ 2024-11-03 16:33  summ1t  阅读(28)  评论(1)    收藏  举报