Atcoder abc298
https://atcoder.jp/contests/abc298/tasks
G - Strawberry War
H行W列
有s[i][j]
个草莓
每次切割,把一个剩余块横向或纵向切成两块
t次切割后,让 一块最多草莓 - 一块最少草莓 尽量小
h,w [1,6]
s[i,j] [0,10^16]
6s
1024mb
我的思路
dp[l,r,t,b,t] = set<pair<min,max> >
因为min越大 max可能也会增大,所以min max应该 成对
这样状态数比较大
注意到状态合并
左侧[min,max] =>
若右侧 l >= min, 取 min(max,右侧r)
若左侧 r <= max, 取 max(min,右侧l)
否则 l < min and max < r 则是 [l,r]
但这样也很大
题解
可能的矩形个数为$\frac{H(H+1)W(W+1)}{4}$
把这些矩形中的 个数 列出$a_1,a_2,\cdots,a_x$
对于$i=1,2,\cdots,X$, 计算 min(max(M)), 其中所有块都$\ge a_i$
dp[minx][maxx][miny][maxy][m] =
, 对应矩形切成m块的 min(max(个数))
X
是 $O(H^2W^2)$
DP是$O(H^2W^2T)$ 个状态, 状态转移$O((H+W)T)$
可以暴力过………
代码
https://atcoder.jp/contests/abc298/submissions/42058278
1 |
|
Ex Sum of Min of Length
n点树, d(u,v)为u..v距离
q个询问:li,ri
$\sum_{j=1}^{N} min(d(j,L_i),d(j,R_i))$
n,q 2e5
3s
1024mb
我的思路
首先树不变化
每次询问,相当于,树上所有点 到 给定 两点最近距离的和
...u.......v...
3部分,u..v链上的点和链上点衍生的树, u..v链以外的点
首先有lca 容易计算出公共祖先和 距离的中点
对于子树向点到u的距离和可以dp[u] = (sum dp[v]) + sz[u]-1
算出来
对于父向的直接算似乎不好算,但是可以换根dp算所有点到u的距离和
因此 对于u…v链以外的点 的距离贡献和就很好算了 = 到u/到v 所有贡献和减去一个分支的距离贡献和
当u,v只有一个中点(否则是两个中点)时,不妨全部是连u
于是可以变成...u...midu-midv...v...
ans = all(u) + all(v) - (midv右子树->u) - (midu左子树->u)
而(midv右子树->u) = midv右子树 贡献和 + 个数 * d(u,midv)
所以似乎就没了?
代码
https://atcoder.jp/contests/abc298/submissions/42059400
1 |
|
总结
G
数据范围小了,反而设计状态更难了,这题都是橙色,也有做过这种枚举下届去dp上界的,这里更需要敢去枚举
dp其实大方向也是对的,问题就是这里 min/max没有局部性就只有大量状态,局部性就需要枚举min或者max, 而这个其实说白了就是枚举,但菜啊
Ex
这Ex没难度啊,感觉G光是赶去逼复杂度就比Ex难啊