C-蓝慧星(牛客) 差分 前缀和

前提:

差分 + 前缀和 = 原数组

差分的目的是方便在一个区间内同时加或减去相同的数,用起来快速方便

原题链接:登录—专业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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值