ucup 2nd 做题记录

· · 个人记录

stage1

G

题意

给一个长度为 nn\le 10^5 )的序列 a ,强制在线地每次 ban 掉一个元素,求当前不包含被 ban 元素的区间中,逆序对个数最多的有多少个

#### 题解 显然区间越大越好,所以只用考虑顶到头的区间 再区间 $[l,r]$ 中 ban 掉元素 $u$ ,形成两个新的区间 $[l,u-1]$ 和 $[u+1,r]$ 我们需要计算两个新区间内的逆序对个数 我们已知 $[l,r]$ 内的逆序对个数,可以暴力求长度较小的区间逆序对,再用主席树, $O(\min\{u-l,r-u\}\log n)$ 的时间求跨过两边的逆序对个数,减一下就可以得出长度较长的区间的逆序对个数 这样复杂度可以类比启发式合并,复杂度为 $O(n\log^2 n)

code

stage2

纯垃圾,别打了(

K

题意

nn\le 5\times 10^4)个学生,每个学生可以在 kk\le 10)个选项中选一个,第 i 个学生选 j 会有 c_{i,j} 的代价。对于每个选项 i ,选此项的人数不能多于 a_i

求如安排每个学生的选项使得总代价最小。

题解

首先一眼费用流,学生一列点,选项一列点,源点到学生连边,学生到选项连费用为 c_{i,j} 流量为 1 的边,选项到汇点连流量为 a_j 的边

但是费用流太慢,考虑模拟费用流

考虑一个残余网络,根据费用流的原理,我们可以在上面任意选一条最短路,流 1 的流量

只考虑形如:“源点 \to 学生 \to 选项 \to 学生 \to\cdots\to 选项 \to 汇点”,的路径,可以覆盖所有情况

考虑从选项到汇点的最短路,我们维护两两选项点间经过一次学生点的最短路,建立一个只包含选项点和汇点的图,再对这个图做SPFA就能 O(k^3) 得到选项到汇点的最短路

若一个学生点 u 有对选项点 v 的流量,那么从这条边推流再流向另一个选项 w 的权值就是 -c_{u,v}+c_{u,w}k^2 个优先队列就能维护所有 v,w 之间最小的权值

我们现在已经得到了每个选项到汇点的最短路 dis_j ,开 k 个优先队列,第 j 个维护现在所有没流的学生 ij 选项的最小距离 c_{i,j} ,选取 c_{i,j}+dis_j 最小的一条路径

路径取出来后,我们需要给路径上每个学生改换流向的选项,更新两个优先队列,这两个优先队列都要加懒删除

最终答案就是每一轮的 c_{i,j}+dis_j 加起来

code

D

题意

n\times m 的格子里最多能放多少国际象棋的象,输出方案

题解

人类智慧题/tuu

我的做法大概是把两个短边放满,然后如果短边为奇数就在中间放一个平行于长边长条,如果偶数就在中间放好多1\times 2的平行于短边的东西,需要特判 1\times 1 、 长边等于短边

code

L

题意

翻牌游戏,有 A-Y 25种颜色每种各两张牌,共 50 张,每轮先翻开一张牌,再翻开另外一张牌(不是同时,先看完第一张再决策第二张),如果相同就保留翻开,否则都返回去且算一次 miss

通讯题,第一次运行程序可以知道每张牌的内容,可以在每张牌上留下 0 或者 1 。第二次运行程序,根拒上次留下的 01 ,要求在平均 13.5 次 miss 以内翻开所有牌 (如果没有 01 的话最优策略需要平均 14.83 次)

题解

(只写完了 dp ,后面没时间写了,我相信应该是对的)

给每种颜色的两张牌分别留下一个 0 和一个 1

考虑 dp ,设 f_{i,u,v} 为当前共有 2i 张牌没翻开,已知了 u 张 0 牌,已知 v 张 1 牌

转移大概就是枚举接下来决策摸一张未知 0 牌还是一张未知 1 牌,翻开后可能与已知牌配对,也可能不会配对,不配对的话下一张要摸 0 牌还是 1 牌,第二张可能和第一张配对,也可能和已知牌配对,也可能不配对

dp 完需要大概 12.9 次,感觉很对

upd:只需要用13次 miss 得知所有1牌,然后每次翻0牌再翻对应的1牌