HGOI 20190830 题解

Problem A 钥匙

有$n$个人和$m$个钥匙在数轴上,人的坐标为$a_i$,钥匙的坐标为$b_i$

而门的坐标为$p$,要让所有人获得一把不同钥匙,并且到达门,最长时间最短是多少。

对于$100\%$的数据满足$10^3 \leq n \leq 10^3 , n \leq k \leq 2\times 10^3$

Solution : 

  对于部分数据,可以二分答案然后进行二分图匹配,实测可以通过$80\%$的数据。

  事实上,对上面算法的极限复杂度是$O(n^2 k log_2 10^9)$

  事实上,我们可以将$nk$中人和钥匙的配对方案求出,直接从后往前贪心。

  这样子复杂度是$O(n \times k (\ log_2 n + log_2 k))$的。

Problem B 汪哥图

给出$n\times m$的$01$矩阵,保证这个矩阵中任意两个$1$之间最多有一条路径不经过$0$。

给出$Q$组询问,求子矩阵联通块个数。

对于$100\%$的数据满足$2 \times 10^3 \leq n,m \leq 2\times 10^3 , 1 \leq Q \leq 2\times 10^5 $

Solution :

  我们先假设这个子矩阵中所有的$1$都自成一格连通块,显然,有好多连通块可以合并。

  由于矩阵中的性质: 任意两个$1$之间最多有一条路径不经过$0$,所以合并的方式一定是从左到右或者从上到下。

  即如果$a[i][j] $和$a[i+1][j]$都是$1$,那么必然会减少一个连通块,如果$a[i][j]$和$a[i][j+1]$都是$1$,也必然会减少一个连通块。

  所以,我们定义$f[i][j] = [a[i][j] = 1 ] \times [a[i+1][j] = 1] , g[i][j] =  [ a[i][j] = 1 ] \times   [a[i][j+1] = 1] $

  对于左上角坐标为$(x_1,y_1)$,右下角坐标为$x_2,y_2$的子矩阵,答案是$ans = \sum\limits_{i=x_1}^{x_2} \sum\limits_{j=y_1} ^ {y_2} a[i][j] -  \sum\limits_{i=x_1}^{x_2 - 1} \sum\limits_{j=y_1} ^ {y_2}  f[i][j] -  \sum\limits_{i=x_1}^{x_2} \sum\limits_{j=y_1} ^ {y_2-1} g[i][j]$

  显然可以用二维前缀和优化。

  复杂度是$O(nm + Q)$

  

 

猜你喜欢

转载自www.cnblogs.com/ljc20020730/p/11434655.html