zoukankan      html  css  js  c++  java
  • hdu 5596 GTW likes gt

    题意:

    问题描述
    从前,有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(Tleq 5)T(T5),表示测试数据组数。
    第二行有两个整数n,mn,m。表示GT的个数和GTW发功的次数。(1leq n leq 50000,1leq mleq 500001n50000,1m50000)
    第三到n+2n+2行,每行有两个整数a_i,b_iai,bi,表示第ii只GT在哪个组和他的能力值 (0leq a[i]leq 1,1leq b[i]leq 10^6)(0a[i]1,1b[i]106)n+3n+3行到第n+m+2n+m+2行,每行有一个整数c_ici,表示GTW第ii次发功的时间。1leq 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并不是有序的

    /*一秒内可以发功多次- -


    思路:

    先想法得出最终的数列,然后倒着遍历,记录走过的两个组的最大值,如果比当前大,则可以消灭当前值,即总数会

    减1.


    Orz:

    主要是一直没什么思路,没有考虑到倒着来搞,感觉遇到几次了QAQ。


    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    typedef long long ll;
    const int INF = 10000;
    
    const int maxn = 1000010;
    int t[maxn],a[maxn],c[maxn];
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n,m;
            scanf("%d%d",&n,&m);
            int max0,max1;
            memset(c,0,sizeof(c));
            for(int i = 1; i <= n; i++)
            {
                scanf("%d%d",&t[i],&a[i]);
            }
            for(int i = 1;i <= m;i++)
            {
                int t;
                scanf("%d",&t);
                c[t]++;
            }
            int sum = 0;
            for(int i = 1;i <= n;i++)
            {
                a[i] += (m-sum);
                sum += c[i];
            }
    
            max0 = max1 = 0;
            //if(ADD[n]){max0--;max1--;}
           // int sum = c[n];
            int sub = 0;
            for(int i = n;i >= 1;i--)
            {
                if(t[i] == 0)
                {
                    if(max1 > a[i])
                        sub++;
                   // a[i] -= sum;
                    max0 = max(max0,a[i]);
                }
                if(t[i] == 1)
                {
                    if(max0 > a[i])
                        sub++;
                    max1 = max(max1,a[i]);
                }
            }
            printf("%d
    ",n-sub);
        }
        return 0;
    }
    

      


  • 相关阅读:
    杭电 HDU 1279 验证角谷猜想
    C# SQL 整表插入
    iframe截取站点的部分内容
    Thrift安装介绍
    赵雅智_Swift(3)_swift凝视
    Android API 文档 离线秒开方法
    xml文件的根节点layout_width或者layout_height设置无效果的原因分析
    函数指针使用演示样例(參考Linux-内核代码)
    eclipse中的项目受svn管理
    野人与传教士问题
  • 原文地址:https://www.cnblogs.com/Przz/p/5409665.html
Copyright © 2011-2022 走看看