LG-P4184 [USACO18JAN]Sprinklers P Solution

更好的阅读体验戳此进入

题面

n×n 的网格图(n个格点,从 (0,0)(n1,n1)),给定 n 个点的坐标 (i,j),保证任意两个坐标的横或纵均不相等,每个点会对 (x,y),x[i,n1],y[j,n1] 进行洒水,对 (x,y),x[0,i],y[0,j] 进行施肥,要求选出一片矩形,使得其中每个格点都既浇水又施肥,求方案数。

或者也可以描述为,给定 n 个关键点,要求选一个矩形使得其中左上右下各自至少有一个关键点,求方案数。

1n105

Solution

前言:核心思路参考自 这篇Blog,主要是我太弱了,有点没太看懂这个大佬柿子的精妙推导,于是尝试自己推了一遍,用比较低端的方法也成功推到 O(n) 了,故提供一种更无脑一些的推柿子的方法。

一道奇怪的题,最终可以转化为无脑推柿子。

首先借一个题解区的图(图片来自 这篇Blog):

从Luogu搬的图,如果你看到这段文字那么说明Luogu的图挂了

不难发现一个妙妙性质,即在第 i 行里,我们假设可行的矩形的左右端点为 [li,ri],那么 li 即为在其不在其下面的所有关键点横坐标的最小值,ri不在其上面的最大值,按照这个规律我们也可以处理出来对于每一列纵坐标可行的最小值 upi,然后可以写一个 O(n4) 的类似二位数矩形的东西,再化简。前面这里如果还是看不懂可以去翻翻题解区,这里不再重复赘述。令 (i,j) 为右下端点,(x,y) 为左上端点,有答案为:

i=1nj=liriy=lij1x=upyi11=i=1nj=liriy=lij1(iupy)=i=1n(j=liri(jli)ij=liriy=lij1upy)=i=1n(i(12(li+ri)(rili+1)(rili+1)li)j=liriy=lij1upy)=i=1n(i(12(rili)(rili+1))j=liriy=lij1upy)

然后我们令 sum1n=i=1nupi,再令 sum2n=i=1nsum1i,有:

i=1n(i(12(rili)(rili+1))j=liriy=lij1upy)=i=1n(i(12(rili)(rili+1))j=liri(sum1j1sum1li1))=i=1n(i(12(rili)(rili+1))j=lirisum1j1+(rili+1)sum1li1)=i=1n(i(12(rili)(rili+1))j=li1ri1sum1j+(rili+1)sum1li1)=i=1n(i(12(rili)(rili+1))sum2ri1+sum2li2+(rili+1)sum1li1)

然后就成功从 O(n4) 推到 O(n) 了。

Code

UPD

update-2022_11_03 初稿