csp-s模拟90
T1:
每格的不透明度相当与一个边权,转化为从起点到终点所有路径的最大值。实现最长路,最好用$dijk$。
T2:
对于$N=100$,$M=8$,考虑状压$dp$。要用一种状态表示某一行的矩形覆盖情况,其实只需要关心矩形端点。用八位四进制,每位上$1$表示这一格是矩形左端点,$2$右端点,$3$既是左又是右端点,$0$不是端点。转移时,枚举下一行的状态,对于下一行的每一个矩形,如果不包含在上一行则产生$1$花费。状态数很少,考虑极限情况一行$8$个$1$,发现最终状态只与某一位是否单独成矩形有关(状态为$3$),不单独成矩形则一定与相邻合成大矩形(状态为$100...002$),也就是可以变成$01$串考虑,总状态$2^8$。对于每行的状态可以$dfs$预处理。总复杂度$\Theta(N*M*2^{2*M})$。
T3:
$30pts$:
按顺序处理操作,对于询问,暴扫前面的矩形,判断是否与下、左边界有交点,取坐标最小中标号最大的矩形。$\Theta(N^2)$.。
$60pts$:
坐标范围小,可以存储每一格做边界的矩形标号。每次询问按$x$从小到大,$y$从小到大,得到相应点,判断是否有边界落在点上。注意处理$x=0$的情况,可以单独处理。
$100pts$:
考虑每一个矩形对询问的贡献,发现它能更新一段区间的斜率的答案。对斜率离散化。分开考虑下、右边界,维护每个斜率的答案(优先坐标最小,其次序号最大),线段树区间修改,单点查询。最终把两个边界得到的答案转化到$x$或$y$比较。