作过相似的题,维护最短路对于$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$,因此咱们的计算是合理的。