糖糖别胡说,我真的不是签到题目 (逆向思维)三星

题意:

链接:https://ac.nowcoder.com/acm/problem/14583
来源:牛客网

有n只萌萌的糖糖,他们分成了两组一起玩游戏。他们会排成一排,第i只糖糖会随机得到一个能力值bi。从第i秒的时候,第i只糖糖就可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的糖糖。

为了使游戏更加有趣,糖糖的爸爸,娇姐,会发功m次,第i次发功的时间为ci,则在第ci秒结束后,b1,b2,…,bci都会增加1.

现在,娇姐想知道在第n秒后,会有多少只糖糖存活下来。

题解:

从后往前考虑,第i个人会影响前面的人,我们维护一个后缀最大值,从后往前遍历,每个数都用后缀最大值去淘汰

#include <bits/stdc++.h>
#define mk make_pair
#define pb push_back
#define pp pop_back
using namespace std;
const int maxn = 50005;
int g[maxn],a[maxn],t[maxn];
int main() {
    int T;
    cin >> T;
    while(T--) {
        int n,m;
        cin >> n >> m;
        for(int i=1;i<=n;i++) {
            cin >> g[i] >> a[i];
        }
        memset(t,0,sizeof(t));
        for(int i=1;i<=m;i++) 
        {
            int x;
            cin >> x;
            if(x > n)continue;
            t[1] += 1;
            t[x+1] -= 1;
        }
        t[0] = 0;
        for(int i=1;i<=n;i++) {
            t[i] += t[i-1];
            a[i] += t[i];
        }
        int ans = 0;
        int mx0 = 0, mx1 = 0;
        for(int i=n;i>0;i--) {
           if(g[i] == 0) {
               if(a[i] < mx1)++ans;
               mx0 = max(mx0 , a[i]);
           } else {
               if(a[i] < mx0) ++ans;
               mx1 = max(mx1 , a[i]);
           }
        }
       cout << n - ans << '\n';
    }
    return 0;
}

/*
1 
4 3 
0 3 
1 2 
0 3 
1 1 
1 3 4
*/ 
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页