hdu 5596 bestcode #66 1002

本文描述了一个有趣的游戏场景,n个游戏角色分为两组进行对决,通过不断增益能量和淘汰对手来比拼生存能力。最终目标是计算经过特定轮次后剩余的角色数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                        GTW likes gt

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 800    Accepted Submission(s): 291


Problem Description
Long long ago, there were n adorkable GT. Divided into two groups, they were playing games together, forming a column. The ith GT would randomly get a value of ability bi . At the ith second, the ith GT would annihilate GTs who are in front of him, whose group differs from his, and whose value of ability is less than his.

In order to make the game more interesting, GTW, the leader of those GTs, would emit energy for m times, of which the ith time of emitting energy is ci . After the ci second, b1,b2,...,bci would all be added 1.

GTW wanted to know how many GTs would survive after the nth second.
 

Input
The first line of the input file contains an integer T(5) , which indicates the number of test cases.

For each test case, there are n+m+1 lines in the input file.

The first line of each test case contains 2 integers n and m , which indicate the number of GTs and the number of emitting energy, respectively. (1n,m50000)

In the following n lines, the ith line contains two integers ai and bi , which indicate the group of the ith GT and his value of ability, respectively. (0ai1,1bi106)

In the following m lines, the ith line contains an integer ci , which indicates the time of emitting energy for ith time.
 

Output
There should be exactly T lines in the output file.

The ith line should contain exactly an integer, which indicates the number of GTs who survive.
 

Sample Input
  
1 4 3 0 3 1 2 0 3 1 1 1 3 4
 

Sample Output
  
3
Hint
After the first seconds,$b_1=4,b_2=2,b_3=3,b_4=1$ After the second seconds,$b_1=4,b_2=2,b_3=3,b_4=1$ After the third seconds,$b_1=5,b_2=3,b_3=4,b_4=1$,and the second GT is annihilated by the third one. After the fourth seconds,$b_1=6,b_2=4,b_3=5,b_4=2$ $c_i$ is unordered.
 

Source
 
官方思路:

首先这道题有一个很显然的O(n∗logn)O(n*logn)O(nlogn)的做法,直接区间加,求区间最大值即可。 但是此题还有一个O(n)O(n)O(n)的做法。我们发现b1,b2,...,bxb_1,b_2,...,b_xb1,b2,...,bx都加111就相当于bx+1,bx+2,...,bnb_{x+1},b_{x+2},...,b_nbx+1,bx+2,...,bn都减111。然后我们可以倒着做,记一下最大值,如果遇到了修改操作,就把最大值减111,然后判断一下这个人会不会被消灭掉,然后再更新一下最大值。

我的代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct node
{
    int x;
    int op;
}data[50005];
int main()
{
    int t;
    scanf("%d",&t);
    int c[50005];

    while(t--)
    {//cout<<"1"<<endl;
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&data[i].op,&data[i].x);
        }
        memset(c,0,sizeof(c));
        int x;
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&x);
            c[x+1]++;
        }
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            data[i].x+=m-cnt;
            cnt+=c[i+1];
        }
        int max0=-10000000;
        int max1=-10000000;
        for(int i=n;i>=1;i--)
        {
            if(data[i].op)
            {
                if(data[i].x<max0)
                {
                    n--;
                }
                max1=max(max1,data[i].x);
            }
            else
            {
                if(data[i].x<max1)
                n--;
                max0=max(max0,data[i].x);
            }
        }
        cout<<n<<endl;
    }
    return 0;
}
/*
2
4 4
0 3
1 2
0 3
1 1
1 2 2 4
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值