9728: Up Down Subsequence

25 篇文章 0 订阅

CSDN话题挑战赛第2期
 

9728: Up Down Subsequence

时间限制: 1.000 Sec  内存限制: 512 MB
提交: 4  解决: 4
[命题人:][下载数据: 110]

提交状态报告

题目描述

Farmer John 的 N 头奶牛(2≤N≤3⋅105),编号为 1…N,排列成 1…N 的一个排列 p1,p2,…,pN。另外给定一个长为 N−1 的字符串,由字母 U 和 D 组成。请求出最大的 K≤N−1,使得存在 p 的一个子序列 a0,a1,…,aK,满足对于所有 1≤j≤K,当字符串中第 j 个字母是 U 时 aj−1<aj,当字符串中的第 j 个字母是 D 时 aj−1>aj。

输入

输入的第一行包含 N。
第二行包含 p1,p2,…,pN。

最后一行包含给定的字符串。

输出

输出 K 的最大可能值。

样例

输入1  复制

5 1 5 3 4 2 UDUD

输出1  复制

4


输入2  复制

5 1 5 3 4 2 UUDD

输出2  复制

3

提示

【样例1解释】
我们可以选择 [a0,a1,a2,a3,a4]=[p1,p2,p3,p4,p5];整个排列与给定的字符串相一致。
【样例2解释】
我们可以选择 [a0,a1,a2,a3]=[p1,p3,p4,p5]。

测试点性质:
测试点 3-4 满足 N≤500。
测试点 5-8 满足 N≤5000。
测试点 9-12 中,字符串中的 U 均在 D 之前。
测试点 13-22 没有额外限制。

来源/分类

USACO 2022 Open Platinum

9728--Up Down Subsequence (jzoj.cn) 

题解

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值