前提:
差分 + 前缀和 = 原数组
差分的目的是方便在一个区间内同时加或减去相同的数,用起来快速方便
原题链接:登录—专业IT笔试面试备考平台_牛客网
彗星出现的持续时间,就像是一个区间。我们可以以时间为下标,由题目范围,我们知道时间最多是2 * 100000即2e5,所以我们可以开两个2e5 + 10的数组,下标表示时间,用两个差分数组进行操作,直接在一个区间两端进行加减。然后再将两个数组分别a[i] += a[i - 1], b[i] += b[i - 1],就得到时间为i时刻蓝、红彗星分别的数量。如果某一时刻蓝彗星数量大于0,即存在蓝彗星,且红彗星数量为0,表明这一时刻符合要求,即可res++。
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int, int> PII;
const double pi = acos(-1.0);
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define rrep(i, n) for (int i = n; i >= (1); --i)
typedef long long ll;
#define sqar(x) ((x)*(x))
//差分 两个差分数组
const int N = 2e5 + 10;
int a[N], b[N];
char s[N];
int main(){
int n, t;
scanf("%d %d", &n, &t);
scanf("%s", s + 1);
rep(i, n){
int k;
scanf("%d", &k);
if(s[i] == 'B') a[k]++, a[k + t]--;
else b[k]++, b[k + t]--;
}
int res = 0;
int x = 0, y = 0;
for(int i = 1; i < 200005; i++){
x += a[i]; y += b[i];
if(x && !y) res++;
}
printf("%d", res);
return 0;
}