thuwc2024
T1
给 \(n\times m\) 的正整数矩阵 \(a\),以及正整数数组 \(a_{1\sim n}\)。
任取 \(\{1,2,\dots,n\}\) 的子集 \(S\),求 \(\sum_{j=1}^m\max_{i\in S}(a_{i,j})-\sum_{i\in S}c_i\) 的最大值。
\(n\le 3000,m\le 15,a,c\le 100\)。
你考虑就是支付代价选一些列出来,然后得到每一行的最大值这么多贡献。
这个最大值我们给它松一松,变成每一行任选一个支付过代价的数。这样就好 dp 了。
你考虑记 \(dp_{i,S}\) 表示当前考虑前 \(i\) 行,目前 \(S\) 这些行已经选过数了。转移考虑如果要选择这一列,就枚举 \(S\) 的超集,复杂度 \(O(n3^m)\),原地升天。
然后你发现有点蠢了。考虑转移的时候,先 \(dp_{i,S}\leftarrow dp_{i-1,S}\),然后我们枚举 \(S\) 去真正计算 \(dp_{i,S}\),这只需要枚举一个元素就可以了,复杂度降为 \(O(nm2^m)\),还是非常爆炸。
你再感受一下,我们是每一列选出一点位置,然后就要支付这一列的代价。如果你知道哪些行选的在同一列,那事实上是很好做的,所以你就先预处理一下 \(f_S\) 表示我选了 \(S\) 这些行最好的一列是多少,然后你 \(3^m\) 转移就可以了,复杂度 \(O(n2^m+3^m)\),这次肯定能过了。
感觉最后这部分优化我还不是完全清楚原理。
哦最后这部分是不是贪心啊,原理还是去除了很多无用转移。但是这原理没用啊。
T2
给定长为 \(n\) 的顺时针环形序列 \(a_{0,\dots,n-1}\)。
一次操作定义为:等概率选取 \(0\le l,r<n\),把 \(a_l\) 顺时针至 \(a_r\) 的元素等概率打乱。
\(m\) 次操作后,\(a_{0,\dots,n-1}\) 的期望。对 \(998244353\) 取模。
\(n\le 131072,m\le 10^9\)。
感性理解发现一次操作会把 \(0,i\) 交换的概率 \(p_i\) 只和 \(0,i\) 之间的距离有关。
一次操作交换的概率显然可以大力讨论。
考虑怎么做 \(m\) 次交换。你发现 \(0,i\) 交换的概率是 \(\sum\limits_{d_1+d_2+\dots+d_m\bmod n=i}\prod p_{d_i}\),这是循环卷积的形式,我们分治 NTT 即可?
T3
有一个 \(n\times m\) 的 01 矩阵 \(a\)。
你可以询问任意矩形内是否有 \(1\),你需要求出 \(a_{i,j}=1\) 满足 \(i+j\) 最大,输出最大的 \(i+j\)。
设询问次数为 \(x\),每次询问的矩形长边之和为 \(y\),要求 \(x\le 8192,y\le 7.4\times 10^4\)。
\(n,m\le 4096\)。
\(n,m\) 给得这么整肯定要分治/二分!
你先把 \(i+j=x\) 的线画出来,是一堆对角线对吧。
初步想法是划分成四个部分,然后询问一些,排除一些。你发现很寄。
考虑一个暴力,你先问右下角,如果有就 win 了,否则靠左上走一步,然后再问,如果有就说明在这个角形里,暴力问就行了。
这样询问次数是 \(3n\),长边之和爆了。
但是显然可以改成二分对吧,询问次数变成 \(\log n+2n\),长边之和是 \(n\log n+2n\)。大概就可以过了。
实在不行把里头这个也改成二分,询问次数 \(3\log n\),长边之和 \(n\log n+4n\)。
真是这东西吗???
这个假完了。
额但是你发现,我们继续做,相当于可以递归到两个 \(\frac n2\) 的子问题,解一下发现询问次数大概是 \(4n\) 次,长边之和我不好说。不过常数好像大得一匹。
T4
初始全 \(0\) 的 \(n\times m\) 矩阵 \(a\),你要进行 \(q\) 次操作。
定义 \(b_{i,j}\) 为,若 \(a_{i,j}=0\) 则 \(b_{i,j}=\infty\);否则为从 \(a_{i,j+1}\) 向右最长连续 \(1\) 的个数。
1 x y1 y2把 \(a_{x,y_1},\dots,a_{x,y_2}\) 赋为 \(1\)。2 x1 y1 x2 y2对 \(a_{x_1,y_1}\to a_{x_2,y_2}\) 的路径,设权值为经过的点中 \(b\) 最小值,求这些路径权值的最大值。\(n\le 10^5,q\le 3\times10^5,m\le 10^9\),操作 \(1\) 次数 \(\le 10^5\)。

浙公网安备 33010602011771号