糖糖别胡说,我真的不是签到题目

这是一道关于算法的题目,描述了一群糖糖分组玩游戏的场景。糖糖们根据能力值和组别在特定时间点消灭对方,而娇姐的发功会影响糖糖的能力值。题目要求计算在所有发功结束后,还有多少糖糖存活。解题者给出的代码尝试通过差分方程和从后往前遍历的方法来解决,但遇到了困难。
摘要由CSDN通过智能技术生成

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

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

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

输入描述:
第一行只有一个整数T(T<6),表示测试数据的组数。
第二行有两个整数n,m。表示糖糖的个数以及娇姐发功的次数。(1<=n<=50000,1<=bi<=1000000)
第三行到n+2行,每行有两个整数ai,bi,表示第i只糖糖属于那一组以及他的能力值。(0<=ai<=1,1<=bi<=1000000)
第n+3行到第n+m+2行,每行有一个整数ci,表示GTW第i次发功的时间.(1<=ci<=n)
输出描述:
总共T行,第i行表示第i组数据中,糖糖存活的个数。
示例1
输入
复制
1 4 3 0 3 1 2 0 3 1 1 1 3 4
输出
复制
3

原谅我太菜了,这道题一直死活不AC,实际上就一个差分方程,然后从后往前遍历就好了,选择他后面的最大值保存,然后进行比较即可。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;

int n, m, t;

struct node {
    int x, y;
};
node st[50010];
int b[50001];

int main() {
    scanf("%d", &t);
    while(t--) {
        memset(b, 0, sizeof(b));
        int cnt = 0;
        scanf("%d %d", &n, &m);
        for (int i = 1; i <= n; i++) 
            scanf("%d %d", &st[i].x, &st[i].y);
        for (int i = 0; i < m; i++) {
            int ts;
            scanf("%d", &ts);
            b[1]++;
            b[++ts]--;
        }
        for (int i = 1; i <= n; i++) {
            b[i] += b[i - 1];
            st[i].y += b[i];
        }
        int max0 = -100000, max1 = -1;
        for (int i = n; i > 0; i--) {
            if (st[i].x == 0) {
                max0 = max(st[i].y, max0);
                if (max1 <= st[i].y)
                    cnt++;
            }
            else {
                max1 = max(max1, st[i].y);
                if (max0 <= st[i].y)
                    cnt++;
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值