牛客练习赛24 C PH试纸

链接:https://www.nowcoder.com/acm/contest/157/C
来源:牛客网

题目描述




      PH试纸,是一种检测酸碱度的试纸,试纸红色为酸性,蓝色为碱性。               HtBest有一个PH试纸,试纸被分成了n段,每一段都可以被染色成红色或者蓝色,WHZ在试纸的每一段上都染为一种颜色,HtBest有m个询问,对于每个询问,Ta想知道某种颜色第qi次在什么地方出现。       
输入描述:
第一行有两个正整数n,m。第二行有n个字母(‘R’或’B’),每个第i个字母表示PH试纸第i段的颜色。接下来m行,第i行有一个大写字母 ci(‘R’或’B’)和一个正整数qi ,用空格隔开,表示查询颜色ci 第qi 次出现的位置。
输出描述:
共m行,第i行一个整数,表示查询结果,若颜色ci出现次数少于qi次,则输出-1,否则输出颜色qi第ci次出现的位置。



示例1



输入
复制

2 2
RB
R 1
B 1



输出
复制

1
2






示例2



输入
复制

2 2
BB
R 1
B 2



输出
复制

-1
2






示例3



输入
复制

3 3
BRB
B 1
B 2
R 1



输出
复制

1
3
2




备注:
对于100%的测试数据:1 ≤ n, m ≤ 1000000所有输入数据不超过1000000。数据量较大,注意使用更快的输入输出方式。
题目描述

官方题解思路:维护每种颜色的前缀和,由于前缀和具有单调性,对于每次 查询,二分查找出该颜色前缀和中值为qi的第一个位置即可。

我是这样做的:用两个数组存储两种颜色,然后判断输出就行了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 1000005
using namespace std;

    char a[maxn],c;
    int x[maxn],y[maxn];
int main()
{
    int n,m,q,xx=0,yy=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]=='R')
            x[xx++]=i;
        else
            y[yy++]=i;
    }
    for(int i=0;i<m;i++)
    {
        cin>>c>>q;
        if(c=='R')
        {
            if(xx>=q)
                printf("%d\n",x[q-1]);
            else
                printf("-1\n");
        }
        else
        {
            if(yy>=q)
                printf("%d\n",y[q-1]);
            else
                printf("-1\n");
        }
    }
    return 0;
}
AC Code

 

posted @ 2018-08-14 17:14  子诚-  阅读(181)  评论(0编辑  收藏  举报