作過相似的題,維護最短路對於$k$的一個凸包,答案就是凸包與$y=s$直線交點的橫座標,這個還挺難打的。數組
然而答案顯然具備單調性,因此直接二分答案就完了。ui
實際上,這個二分答案的操做,等價於選定直線$x=mid$,spa
求出$x=mid$與凸包的交點的縱座標,並經過這個縱座標與$s$比較來肯定最終的$mid$即答案。指針
將鳥的移動轉化爲人的移動,則問題是相鄰$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,
用線段樹進行加減操做,維護最值就完了。
設$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$,因此咱們的計算是合理的。