ssoj1338蜘蛛侠 trampolin

来源:互联网 发布:杂志排版设计软件 编辑:程序博客网 时间:2024/04/29 15:12

题意:有n栋高楼,一个人从第k栋开始跳,每次只能跳到相邻的左右两个房子。有些房子上有蹦床,可以跳到任意高度任意位置的房子。问从k最多能跳几个房子。

思路:1、一路上不会碰到蹦床,求个最长单调不增+反向等高就行。

           2、会碰到蹦床:发现碰到一个蹦床就可以到达任意的蹦床,又发现跳到一个蹦床,所有蹦床能到达的区域就都能到达。蹦床能到达的区域:相邻向左向右最长不降。ans=蹦床区域+路上最长单调的非蹦床区域。

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int maxn=300005;int h[maxn],n,k,ans=0,sum;bool f[maxn];char s[maxn];inline int get(){    char c;bool flag=0;while(!isdigit(c=getchar()))if(c=='-')flag=1;    int v=c-48;while(isdigit(c=getchar()))v=v*10+c-48;if(flag)v=-v;    return v;}int main(){    n=get();k=get();    memset(f,0,sizeof(f));    for(int i=1;i<=n;++i)h[i]=get();    scanf("%s",s+1);    for(int i=1;i<=n;++i){    if(s[i]=='T'){    f[i]=1;      int j=i-1;    while(j && h[j]>=h[j+1])f[j]=1,--j;    j=i+1;    while(j<=n && h[j]>=h[j-1])f[j]=1,++j;}}if(f[k]){sum=0;f[0]=f[n+1]=1;    for(int i=1;i<=n;++i){    if(f[i]){sum=0;continue;}    if(f[i-1] || h[i]<=h[i-1])++sum;else sum=1;ans=max(ans,sum);}sum=0;for(int i=n;i>=1;--i){    if(f[i]){sum=0;continue;}    if(f[i+1] || h[i]<=h[i+1])++sum;else sum=1;ans=max(ans,sum);}for(int i=1;i<=n;++i)ans+=f[i];}else{    int l=k-1,r=k+1;    while(l && h[l]<=h[l+1])--l;++l;    while(r<=n && h[r]==h[r-1])++r;--r;    ans=max(ans,r-l+1);    l=k-1,r=k+1;    while(r<=n && h[r]<=h[r-1])++r;--r;    while(l && h[l]==h[l+1])--l;++l;    ans=max(ans,r-l+1);}printf("%d\n",ans);return 0;}



0 0
原创粉丝点击