模擬87 題解

A. maze

作過相似的題,維護最短路對於$k$的一個凸包,答案就是凸包與$y=s$直線交點的橫座標,這個還挺難打的。數組

然而答案顯然具備單調性,因此直接二分答案就完了。ui

實際上,這個二分答案的操做,等價於選定直線$x=mid$,spa

求出$x=mid$與凸包的交點的縱座標,並經過這個縱座標與$s$比較來肯定最終的$mid$即答案。指針

 

 

 

B. bird

將鳥的移動轉化爲人的移動,則問題是相鄰$k$個位置最多打一槍。字符串

設$dp_i$表示最後一槍在$i$處打的最優答案。it

那麼有轉移$dp_i=dp_j+cnt_{j,i}$,$cnt_{j,i}$表示$j$處打不到但$i$處能打到的鳥的個數。class

這個東西並不難維護,im

對於每個鳥,咱們只要移動

在$l_i$處給$dp_0$~$dp_{l-1}$加上1,字符集

在$r_{i+1}$處給$dp_0$~$dp_{l-1}$減去1,

用線段樹進行加減操做,維護最值就完了。

 

 

 

C. stone

設$f(i,j)$表示點對$(i,j)$是否合法,只有$0/1$兩個取值。

有轉移

$a[i]=b[j]$  $f[i+1][j+1]=f[i][j]$

$a[i]!=b[j]$  $f[i+1][j]=f[i][j],f[i][j+1]=f[i][j]$

顯然對於同一個$i$,$f(i,j)$取值爲$1$的區間大概是連續的,設左右端點分別爲$l_i$,$r_i$。

$l$,$r$數組的求法都是簡單的。

然而$l_i,r_i$範圍內並不全爲$1$,其中穿插着許多$0$。

總的答案是$l_i$,$r_i$範圍減去其中$0$的個數。

不妨先打出表來,實際上,打出的表告訴咱們,結論是:答案要減去的是$b$字符串$l_i$,$r_i$範圍內,

與字符串$s=a[i-1],a[i]$逆序的子串個數,即$l_i<=j<=r_i$ $a[i]==b[j-1],a[i-1]==b[j],a[i]!=a[i+1]$的個數。

一句話,答案爲:$ans=\sum \limits_{i=1}^{n}r_i-l_i+1-\sum \limits_{j=l_i}^{r_i}[a[i]==b[j-1],a[i-1]==b[j],a[i]!=a[i-1]]$

因爲$l$,$r$數組都是單調不降的,加上字符集只有$A,B,C$。

能夠直接用單調指針求出後一個求和式,固然前綴和也是能夠的。

 

考慮表中的$0$意味着什麼。

由於$a[i-1]!=b[j-1]$ $a[i-1]==b[j]$ $a[i]==b[j-1]$等價於$a$,$b$造成逆序串。

咱們用逆序串的個數求出了$f$值等於$0$的點對數,因此要證實的是:(注意下面的$f[i][j]$保證$j$在$l_i,r_i$範圍內)

$f[i][j]=0$的充要條件是

1.$a[i-1]!=b[j-1]$

2.$a[i-1]==b[j]$

3.$a[i]==b[j-1]$

 

由於$f[i][j]$沒有被$f[i-1][j-1]$轉移,那麼$f[i-1][j-1]==0$或$a[i-1]!=b[j-1]$。

由於$f[i][j]$沒有被$f[i-1][j]$轉移,那麼$f[i-1][j]==0$或$a[i-1]==b[j]$

由於$f[i][j]$沒有被$f[i][j-1]$轉移,那麼$f[i][j-1]==0$或$a[i]==b[j-1]$

由於有三個或,其充分性是顯然的。

 

下面證$f[i-1][j]=1$和$f[i][j-1]=1$,即條件2 3是必要的:

1.假設$f[i-1][j-1]=1$,那麼由$f[i][j]=0$,

$f[i-1][j-1]$一定要轉移到$f[i-1][j]$和$f[i][j-1]$,因此$f[i-1][j]=f[i][j-1]=1$。

2.假設$f[i-1][j-1]=0$,由上述的證實,咱們能夠概括得知$f[i-1][j-2]=1$,

因爲$f[i-1][j-1]=0$,那麼$f[i-1][j-2]$一定要轉移到$f[i][j-1]$,因此$f[i][j-1]=1$,同理可得$f[i-1][j]=1$。

證畢。

 

下面證條件1是必要的:

1.假設$f[i-1][j-1]=1$,那麼顯然是必要的。

2.假設$f[i-1][j-1]=0$,那麼在$(i-1,j-1)$,字符串$a$,$b$已經造成了逆序串,那麼顯然$a[i-1]!=b[j-1]$。

 

因此上述三個條件是充要的,$(i,j)$存在逆序串等價於$f[i][j]=0$,因此咱們的計算是合理的。

相關文章
相關標籤/搜索