Codeforces Round #244 (Div. 2)B. Prison Transfer(想法题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #244 (Div. 2)B. Prison Transfer(想法题)相关的知识,希望对你有一定的参考价值。

传送门

Description

The prison of your city has n prisoners. As the prison can‘t accommodate all of them, the city mayor has decided to transfer c of the prisoners to a prison located in another city.

For this reason, he made the n prisoners to stand in a line, with a number written on their chests. The number is the severity of the crime he/she has committed. The greater the number, the more severe his/her crime was.

Then, the mayor told you to choose the c prisoners, who will be transferred to the other prison. He also imposed two conditions. They are,

  • The chosen c prisoners has to form a contiguous segment of prisoners.
  • Any of the chosen prisoner‘s crime level should not be greater then t. Because, that will make the prisoner a severe criminal and the mayor doesn‘t want to take the risk of his running away during the transfer.

Find the number of ways you can choose the c prisoners.

Input

The first line of input will contain three space separated integers n (1 ≤ n ≤ 2·105), t (0 ≤ t ≤ 109) and c (1 ≤ c ≤ n). The next line will contain n space separated integers, the ith integer is the severity ith prisoner‘s crime. The value of crime severities will be non-negative and will not exceed 109.

Output

Print a single integer — the number of ways you can choose the c prisoners.

Sample Input

4 3 3
2 3 1 1

1 1 1
2

11 4 2
2 2 0 7 3 2 2 4 9 1 4

Sample Output

2

0

6

思路

题解:

试了一发暴力,果断超时,后来想了下,我们只需要记录下超过t的数,然后根据相邻两次超过t的数的位置求得此段不超过t的最长区间,看看是否符合题意,然后就可以计算出有多少种方法了。

 

#include<bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int a[maxn], pos[maxn] = {0};

int main()
{
    int n, t, c, p = 1, res = 0;
    scanf("%d%d%d", &n, &t, &c);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        if (a[i] > t)   pos[p++] = i;
    }
    pos[p++] = n + 1;
    if (pos[1] == 0)	res += 1 + (n - c);
    else
    {
        for (int i = 1; i < p; i++)
        {
            int len = pos[i] - pos[i - 1] - 1;
            if (len >= c)
            {
                res += 1 + (len - c);
            }
        }
    }
    printf("%d\n", res);
    return 0;
}

  

以上是关于Codeforces Round #244 (Div. 2)B. Prison Transfer(想法题)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #244 (Div. 2) D. Match & Catch 后缀数组

Educational Codeforces Round 35 CTwo Cakes

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)

Codeforces Global Round 19