考虑到棋子一定是阶梯状排列据说爆搜一发只有35w种状态
那么就直接上哈希+记忆化+(Min-Max)对抗搜索,注意要记忆化倒着搜
还看到了一种神仙状态,先加(m)个(0),若有一行有(k)个棋子,就在第(m)个(0)后面插入一个(1),状态数应该更少?
数字从大到小排序
先考虑数字互不相同的情况,显然每个节点在父亲节点可选择区间内,选没被选到的最大的那一段区间
如果有相同数字这样就会出问题,例如数字是(7,6,5,5,5,5),其中(1)节点子树大小是(4),(2)节点子树大小是(2)
考虑每个数字维护一个(c_i)表示自己加上左边还有几个数字能被选择
那么处理一个节点,根据贪心,找到这个点能选到的最大数字(([pos,n])的(c_i)都大于这个点子树大小的最靠左的位置),又根据贪心,我们应该选择这个数字中最靠右的一个
此时知道这个数字左边应该留出(siz[x])个数字放到(x)的子树内,但是我们不能直接钦点是哪些数字,因为不知道后面的节点是什么情况
此时可以对([pos,n])减去(siz[x]),表示这些位置左边可以选的数字少了(siz[x])个,用来限制住想要对(pos)左边数字下手的节点,(c_i)的含义可以理解为,别的节点至多能在我左边拿走几个
遍历到子树内的时候,要把父亲的影响减去,因为父亲的限制是用来限制住同深度的节点,当自己的子树想要在内部寻找数字的时候应该放开限制,根据贪心,子树必定会选择它们父亲限制的那些数字
有一个比较显然的暴力:
(f[i][j])表示包含(i)的联通块,权值大于(a[i])的有(j)个的方案数,我们有一个(O(n^2k))的算法
观察到(O(n^2k))大概只有(4e9),但是开了(7s),所以卡卡常就过了
不会有人觉得我要写正解吧,不会吧不会吧
如果读懂题还不是很难但是我被题意杀了
先考虑(C=1)的很厚的暴力分
最优方案可以直接(O(nm))确定下来
第二问可以二分答案,把每个人放在哪个位置才能三个愿望一次满足
再考虑(C eq 1)的情况,可以考虑魔改一发匈牙利,让右侧节点每个节点能够接受(b[i])个点这样子
对于每个人,志愿从第一到最后跑匈牙利
如果第二问依旧二分的话,我们要存下每个人跑完匈牙利后的图,匈牙利要用(set)维护,复杂度可能是(O(n^2clogn))这样子
但是注意到一个性质,对于一个点,匈牙利遍历到前面某个节点的时候,说明如果没有前面这个节点,就匹配成功了,所以第二问不用二分,直接匈牙利的时候记录一下访问到的最考前的点
求(k+1)条路径,让和最大
(WQS)二分裸题
就考虑一下怎么求答案吧
(dp[0/1/2][x])表示以(x)为根的子树,下面向上连接了几条边
为什么要加一个(2)?因为这个节点只能和某两个子树凑成一条链,如果不加(2)那就只能合并到(0)的状态,可能会出现和子树合并出了两个或更多链的情况
如果二分找的是最小的可选取的让路径(ge k+1)的斜率(m),那么需要选尽量多的路径