原题解链接:https://ac.nowcoder.com/discuss/151166

二分

首先我们明确一点,如果要放障碍物00号方格左右最多放一个,因为只要碰到一个就不会继续走过去了,也就是说放置多个障碍物只有最靠近0号方格的是有意义的。

此外因为要保证最后一次到达没到过的地方,不可能两侧都放,因为这样的话要不就是不满足题意,要不就是其中一个障碍没有意义,所以障碍物的上限是11个。

然后如果最后一个指令为L/RL/R,那么障碍物要放一定放在0 0号方格右侧/左侧。且以障碍物放在00号方格右侧为例,如果障碍物放在xx处满足题意的话,放在x1x-1这个位置也是满足题意的(最后向左能走得更远)。

据此我们只要去查找障碍物可以摆放的最右位置,满足单调性质,用二分查找即可。


#include <cstdio>
#include <bits/stdc++.h>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)

typedef long long ll;
const int maxn = 1000005;
const ll INF = 1e18;
const ll mod=1e9+7;
const double eps = 1e-7;

char s[maxn];
char tmp;
int len;

int check(int x)
{
    int pos=0;
    int Max=0;
    for(int i=0;i<len;i++)
    {
        Max=max(Max,pos);
        if(s[i]==tmp) pos++;
        else pos--;
        if(pos==-x) pos++;
    }
    return pos>Max;
}

int main()
{
    int len1;
    scanf("%d",&len1);
    scanf("%s",s);
    len=strlen(s);
    tmp=s[len-1];
    int l=1,r=len;
    int ans=-1;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(check(mid))
        {
            ans=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    if(ans==-1) puts("-1");
    else if(ans==len) puts("0 1");
    else printf("1 %d\n",ans);
}