1 条题解

  • 0
    @ 2025-8-24 22:37:35

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar xiaoyaowudi
    想回到最初原点 拨琴弦唱起岁月 不畏惧未来渺远 只牵挂那心愿

    搬运于2025-08-24 22:37:35,当前版本为作者最后更新于2022-04-05 09:40:27,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意

    给定一个排列 pp 和一个字符串 ssss 由大于小于号组成,求 pp 中最长的子序列 t0,t1,t2tkt_0,t_1,t_2\cdots t_k 使得 ti,ti+1t_i,t_{i+1} 的大小关系和 si+1s_{i+1} 相同。

    n3×105n\le 3\times 10^5

    分析

    下文假设如果 xx 表示一个大于小于号,那么 x^\hat{x} 表示相反的符号。

    fif_ip1,p2,pip_1,p_2,\cdots p_i 中以 pip_i 结尾的子序列在 sis_i 中能匹配的最长前缀长度。

    下证,存在一个下标子序列 x0,x1xfi,xfi=ix_0,x_1\cdots x_{f_i},x_{f_i}=i 使得 0kfi,k=fxk\forall 0\le k\le f_i,k=f_{x_k}px0,pxfip_{x_0},\cdots p_{x_{f_i}} 能够匹配 s1,s2sfis_1,s_2\cdots s_{f_i}

    假设 t0,t1,tfit_0,t_1,\cdots t_{f_i}xfk,xfk1,x0x_{f_k},x_{f_k-1},\cdots x_0 字典序最小时对应的 px0,px1pxfip_{x_0},p_{x_1}\cdots p_{x_{f_i}},因为 子序列个数有限,因此 tt 存在。

    若存在 0k<fi0\le k \lt f_i 使得 fxk>fif_{x_k}\gt f_i

    假设 j=xk,r=fj,l=fij=x_k,r=f_j,l=f_ijj 达成最大匹配时子序列为 b0,b1brb_0,b_1\cdots b_r

    那么 $b_{k}\; s_{k+1}\;b_{k+1}\;s_{k+2}\cdots b_{r-1}\;s_{r}\;b_{r}$,且 $b_r=t_k \;s_{k+1}\; t_{k+1}\;s_{k+2}\;\cdots s_{l}\;t_{l} $。

    下证 bk,bk+1,br=tk,tlb_{k},b_{k+1},\cdots b_{r}=t_k,\cdots t_l 存在一个长度为 lk+1l-k+1lkl-k 的子序列能够匹配 sk+1,sk+2sl+1s_{k+1},s_{k+2}\cdots s_{l+1}sk+1,sk+2sls_{k+1},s_{k+2}\cdots s_l

    km<l\forall k\le m\lt lbk  sk+1  tk+1b_{k} \;s_{k+1}\;t_{k+1} 不成立。

    那么分两种情况,sk+1=sk+2=sls_{k+1}=s_{k+2}=\cdots s_{l}

    那么 bl  sl^  bl1  sl^  tlb_{l}\; \hat{s_l}\;b_{l-1}\; \hat{s_{l}}\;t_{l},即 bl  sl^  tlb_{l} \;\hat{s_l}\; t_l,于是 sl+1,sl+2srs_{l+1},s_{l+2}\cdots s_{r} 中必存在一个前缀使得 sl+1,sl+2,sd,l<drs_{l+1},s_{l+2},\cdots s_{d},l\lt d\le r,且 $s_{k+1}=s_{k+2}=\cdots =s_{l}=s_{l+1}\cdots s_{d-1}=\hat{s_d}$,由传递性可知 $t_l\;s_{l}\;b_{l}\;s_{l+1}\; b_{l+1} \cdots s_{d-1}\;b_{d-1}$ 可以推出 bd1  sd1^  tlb_{d-1} \;\hat{s_{d-1}}\;t_{l} ,又 sd1^=sd\hat{s_{d-1}}=s_d 那么 bd1  sd  tlb_{d-1}\; s_d\; t_{l},于是存在一个以 ii 结尾的子序列可以匹配 ss 的前缀长度为 d>l=fid\gt l=f_i 矛盾!

    否则存在相邻两项 sd+1=sd^,k<d<ls_{d+1}=\hat{s_{d}},k\lt d\lt l,那么 bd1  sd^  tdb_{d-1}\;\hat{s_d}\; t_dbd  sd^  bd1b_{d}\;\hat{s_d} \;b_{d-1}td+1  sd+1  bdt_{d+1}\;s_{d+1}\;b_{d}td  sd+1  td+1t_{d}\;s_{d+1}\;t_{d+1},于是 $b_{d-1}\;\hat{s_{d}}\;t_{d}\;s_{d+1}\;t_{d+1}\;s_{d+1}\;b_{d}\;\hat{s_{d}}\;b_{d-1}$。

    sd+1=sd^s_{d+1}=\hat{s_d} 可知中间四个符号都相同,那么 bd1  sd1  bd1b_{d-1}\;s_{d-1}\; b_{d-1} 矛盾!

    所以 km<l\exists k\le m\lt l,使得 bk  sk+1  tk+1b_{k}\;s_{k+1}\;t_{k+1}

    那么此时把 tm+1,tm+2tlt_{m+1},t_{m+2}\cdots t_{l} 接到 b0,b1bmb_{0},b_{1}\cdots b_{m} 后面也是一组合法的解,此时 $x^{\prime}_{f_i},x^{\prime}_{f_i-1},\cdots x^{\prime}_0$ 的字典序更小,因为 xmx_{m} 变小了而 xm+1,xfix_{m+1},\cdots x_{f_i} 均没变化。

    与假设矛盾!

    若存在 0k<fi0\le k\lt f_{i} 使得 fxkkf_{x_k}\neq k ,那么这时令 j=xk,r=fj,l=rj=x_k,r=f_{j},l=rjj 达成最大匹配时子序列为 b0,b1brb_0,b_1\cdots b_r

    与上面同理,只有 sk+1=sk+2=sls_{k+1}=s_{k+2}\cdots =s_l 时会推出 br=bl  sl^  tlb_{r}=b_{l}\;\hat{s_{l}}\;t_{l},而 br=tkb_r=t_k ,由 sk+1=sk+2=sls_{k+1}=s_{k+2}\cdots =s_l 得出 br  sl  tlb_r\; s_l\;t_l,矛盾!

    命题成立。

    因此我们可以直接用树状数组维护 dp 值。

    Code

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    constexpr int N=300010;
    int b1[N],b2[N];
    void upd(int *b,int x,int v){for(;x<N;x+=(x&(-x))) b[x]=max(b[x],v);}
    int qry(int *b,int x){int ans=0;for(;x;x-=(x&(-x))) ans=max(ans,b[x]);return ans;}
    char s[N];int n,a[N];
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i) scanf("%d",&a[i]);scanf("%s",s+1);int ans=0;
    	for(int i=1;i<=n;++i){
    		int f=max(qry(b1,a[i]-1),qry(b2,n-a[i]));ans=max(ans,f);
    		if(s[f+1]=='U') upd(b1,a[i],f+1);else upd(b2,n-a[i]+1,f+1);
    	}
    	printf("%d\n",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    7617
    时间
    2000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者