HDU 5596:GTW likes gt

45 篇文章 0 订阅

GTW likes gt

 
 Accepts: 54
 
 Submissions: 782
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 131072/131072 K (Java/Others)
问题描述
从前,有nn只萌萌的GT,他们分成了两组在一起玩游戏。他们会排列成一排,第ii只GT会随机得到一个能力值b_ibi。在第ii秒的时候,第ii只GT可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的GT。
为了使游戏更加有趣,GT的首领GTW会发功mm次,第ii次发功的时间为c_ici,则在第c_ici秒结束后,b_1,b_2,...,b_{c_i}b1,b2,...,bci都会增加1。
现在,GTW想知道在第nn秒之后,会有几只GT存活下来。
输入描述
第一行只有一个整数T(T\leq 5)T(T5),表示测试数据组数。
第二行有两个整数n,mn,m。表示GT的个数和GTW发功的次数。(1\leq n \leq 50000,1\leq m\leq 500001n50000,1m50000)
第三到n+2n+2行,每行有两个整数a_i,b_iai,bi,表示第ii只GT在哪个组和他的能力值 (0\leq a[i]\leq 1,1\leq b[i]\leq 10^6)(0a[i]1,1b[i]106)n+3n+3行到第n+m+2n+m+2行,每行有一个整数c_ici,表示GTW第ii次发功的时间。1\leq c[i]\leq n1c[i]n
输出描述
总共TT行,第ii行表示第ii组数据中,GT存活的个数。
输入样例
1
4 3
0 3
1 2
0 3
1 1
1
3
4
输出样例
3
Hint
11秒后 能力值为4\ 2\ 3\ 14 2 3 122秒后 能力值为4\ 2\ 3\ 14 2 3 133秒后 能力值为5\ 3\ 4\ 15 3 4 1,第22只GT被第33只GT消灭掉了
第44秒后 能力值为6\ 4\ 5\ 26 4 5 2
c_ici并不是有序的

这个题目的思路其实和Hackerrank上的这道题是一样的。https://www.hackerrank.com/challenges/stockmax

都是问这个数与之后比它大的数的影响的。可以从后往前面扫,记最大值,如果碰到比最大值小的,去掉即可。

代码:

#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <cstdio>
using namespace std;
typedef long long ll;

const int maxn = 50005;

struct no
{
    int team;
    int en;
}node[maxn];

int n, m;//GT的个数 GTW发功的次数
int c[maxn];//发功的时间

int pos[maxn];

void input()
{
    int i, j;

    memset(pos, 0, sizeof(pos));

    scanf("%d%d", &n, &m);

    for (i = 1; i <= n; i++)
    {
        scanf("%d%d", &node[i].team, &node[i].en);
        node[i].team++;
    }
    for (i = 1; i <= m; i++)
    {
        scanf("%d", &c[i]);
        pos[c[i]]++;
    }

}

void solve()
{
    int i;
    int kill1 = -1;
    int kill2 = -1;
    int res = n;
    
    for (i = n; i >= 1; i--)
    {
        kill1 = kill1 - pos[i];
        kill2 = kill2 - pos[i];
        
        if (node[i].team == 1)
        {
            if (kill2 > node[i].en)
            {
                res--;
            }
            kill1 = max(kill1, node[i].en);
        }
        else
        {
            if (kill1 > node[i].en)
            {
                res--;
            }
            kill2 = max(kill2, node[i].en);
        }
    }
    cout << res << endl;
}

int main()
{
    //freopen("i.txt", "r", stdin);
    //freopen("o.txt", "w", stdout);

    int t;
    scanf("%d", &t);

    while (t--)
    {
        input();
        solve();
    }
    //system("pause");
    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值