A. maze
做過類似的題,維護最短路對於$k$的一個凸包,答案就是凸包與$y=s$直線交點的橫坐標,這個還挺難打的。
然而答案顯然具有單調性,所以直接二分答案就完了。
實際上,這個二分答案的操作,等價於選定直線$x=mid$,
求出$x=mid$與凸包的交點的縱坐標,並通過這個縱坐標與$s$比較來確定最終的$mid$即答案。
B. bird
將鳥的移動轉化為人的移動,則問題是相鄰$k$個位置最多打一槍。
設$dp_i$表示最后一槍在$i$處打的最優答案。
那么有轉移$dp_i=dp_j+cnt_{j,i}$,$cnt_{j,i}$表示$j$處打不到但$i$處能打到的鳥的個數。
這個東西並不難維護,
對於每一個鳥,我們只要
在$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$,所以我們的計算是合理的。
