洛谷P4611 [COCI2011-2012#7] TRAMPOLIN

题目

题解:

模拟题,O(n)
若i可以跳到i-1,且i-1有蹦床,说明i也可以跳到所有点,相当于i也有蹦床,i+1同理
le[i]表示从i开始往左能跳到多少个点,ri[i]表示往右

标程:

#include<bits/stdc++.h>
using namespace std;
const int N=300003;
int n,m,i,le[N],ri[N],l,r,mx,T,h[N];
char s[N];
inline char gc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
inline int read(){
    int x=0,fl=1;char ch=gc();
    for (;ch<48||ch>57;ch=gc())if(ch=='-')fl=-1;
    for (;48<=ch&&ch<=57;ch=gc())x=(x<<3)+(x<<1)+(ch^48);
    return x*fl;
}
int main(){
    n=read();m=read();
    for (i=0;i<n;i++) h[i]=read();
    scanf("%s",s);
    for (i=1;i<n;i++)
        if (h[i]>=h[i-1]){
            if (s[i-1]=='T') s[i]='T';
            le[i]=le[i-1]+1;
        }
    for (i=n-2;i>=0;i--)
        if (h[i]>=h[i+1]){
            if (s[i+1]=='T') s[i]='T';
            ri[i]=ri[i+1]+1;
        }
    m--;
    if (s[m]=='T'){
        for (i=0;i<n;i++)
            if (s[i]=='T') T++;
            else mx=max(mx,max(le[i],ri[i])+1);//是max,不是加,很多人会习惯性写成加
        printf("%d",T+mx);
    }else{
        l=r=m;
        while (l && h[l-1]==h[m]) l--;
        while (r<n-1 && h[r+1]==h[m]) r++;
        printf("%d",r-l+1+max(le[l],ri[r]));
    }
}

猜你喜欢

转载自blog.csdn.net/xumingyang0/article/details/80673735