zoukankan      html  css  js  c++  java
  • D. Yet Another Monster Killing Problem

    You play a computer game. In this game, you lead a party of mm heroes, and you have to clear a dungeon with nn monsters. Each monster is characterized by its power aiai. Each hero is characterized by his power pipi and endurance sisi.

    The heroes clear the dungeon day by day. In the beginning of each day, you choose a hero (exactly one) who is going to enter the dungeon this day.

    When the hero enters the dungeon, he is challenged by the first monster which was not defeated during the previous days (so, if the heroes have already defeated kk monsters, the hero fights with the monster k+1k+1). When the hero fights the monster, there are two possible outcomes:

    • if the monster's power is strictly greater than the hero's power, the hero retreats from the dungeon. The current day ends;
    • otherwise, the monster is defeated.

    After defeating a monster, the hero either continues fighting with the next monster or leaves the dungeon. He leaves the dungeon either if he has already defeated the number of monsters equal to his endurance during this day (so, the ii-th hero cannot defeat more than sisi monsters during each day), or if all monsters are defeated — otherwise, he fights with the next monster. When the hero leaves the dungeon, the current day ends.

    Your goal is to defeat the last monster. What is the minimum number of days that you need to achieve your goal? Each day you have to use exactly one hero; it is possible that some heroes don't fight the monsters at all. Each hero can be used arbitrary number of times.

    Input

    The first line contains one integer tt (1t1051≤t≤105) — the number of test cases. Then the test cases follow.

    The first line of each test case contains one integer nn (1n21051≤n≤2⋅105) — the number of monsters in the dungeon.

    The second line contains nn integers a1a1, a2a2, ..., anan (1ai1091≤ai≤109), where aiai is the power of the ii-th monster.

    The third line contains one integer mm (1m21051≤m≤2⋅105) — the number of heroes in your party.

    Then mm lines follow, each describing a hero. Each line contains two integers pipi and sisi (1pi1091≤pi≤109, 1sin1≤si≤n) — the power and the endurance of the ii-th hero.

    It is guaranteed that the sum of n+mn+m over all test cases does not exceed 21052⋅105.

    Output

    For each test case print one integer — the minimum number of days you have to spend to defeat all of the monsters (or 1−1 if it is impossible).

    Example
    input
    Copy
    2
    6
    2 3 11 14 1 8
    2
    3 2
    100 1
    5
    3 5 100 2 3
    2
    30 5
    90 1
    
    output
    Copy
    5
    -1
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    #include <set>
    #include <queue>
    #include <map>
    #include <sstream>
    #include <cstdio>
    #include <cstring>
    #include <numeric>
    #include <cmath>
    #include <iomanip>
    #include <deque>
    #include <bitset>
    //#include <unordered_set>
    //#include <unordered_map>
    #define ll              long long
    #define pii             pair<int, int>
    #define rep(i,a,b)      for(ll  i=a;i<=b;i++)
    #define dec(i,a,b)      for(ll  i=a;i>=b;i--)
    #define forn(i, n)      for(ll i = 0; i < int(n); i++)
    using namespace std;
    int dir[4][2] = { { 1,0 },{ 0,1 } ,{ 0,-1 },{ -1,0 } };
    const long long INF = 0x7f7f7f7f7f7f7f7f;
    const int inf = 0x3f3f3f3f;
    const double pi = 3.14159265358979323846;
    const double eps = 1e-6;
    const int mod = 998244353;
    const int N = 1e6 + 5;
    //if(x<0 || x>=r || y<0 || y>=c)
    
    inline ll read()
    {
        ll x = 0; bool f = true; char c = getchar();
        while (c < '0' || c > '9') { if (c == '-') f = false; c = getchar(); }
        while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
        return f ? x : -x;
    }
    ll gcd(ll m, ll n)
    {
        return n == 0 ? m : gcd(n, m % n);
    }
    ll lcm(ll m, ll n)
    {
        return m * n / gcd(m, n);
    }
    bool prime(int x) {
        if (x < 2) return false;
        for (int i = 2; i * i <= x; ++i) {
            if (x % i == 0) return false;
        }
        return true;
    }
    inline int qpow(int x, ll n) {
        int r = 1;
        while (n > 0) {
            if (n & 1) r = 1ll * r * x % mod;
            n >>= 1; x = 1ll * x * x % mod;
        }
        return r;
    }
    inline int add(int x, int y) {
        return ((x%mod)+(y%mod))%mod;
    }
    inline int sub(int x, int y) {
        x -= y;
        return x < 0 ? x += mod : x;
    }
    inline int mul(int x, int y) {
        return (1ll * (x %mod) * (y % mod))%mod;
    }
    inline int Inv(int x) {
        return qpow(x, mod - 2);
    }
    int mx[N],a[N],p[N],s[N];
    
    int main()
    {
        int T;
        cin >> T;
        while (T--)
        {
            int n;
            cin >> n;
            rep(i, 1, n)
                a[i] = read();
            int m;
            cin >> m;
            rep(i, 1, m)
            {
                p[i] = read();
                s[i] = read();
                mx[s[i]] = max(mx[s[i]], p[i]);
            }
            dec(i, n, 0)
            {
                mx[i] = max(mx[i], mx[i + 1]);
            }
            int f=0,day = 0;
            for(int i=1;i<=n;)
            {
                if (a[i] > mx[1])
                {
                    f = 1;
                    cout << "-1" << endl;
                    break;
                }
                int j = 0, maxn = 0;
                for (; j <= n; j++)
                {
                    maxn = max(maxn, a[i + j]);
                    if (mx[j + 1] < maxn)
                        break;
                }
                day++;
                i += j;
            }
            if (f == 0)
                cout << day << endl;
            rep(i, 0, n)
                mx[i] = 0;
        }
        return 0;
    }
  • 相关阅读:
    bzoj 1026
    mysql索引面试题
    Mybatis基础,动态sql (mybatis中的重点)
    Mybatis基础,利用mybatis实现复杂查询,多对一,一对多
    Mybatis基础:注解开发,面向接口(引出三个面向的区别)
    Mybatis基础,limit分页,和RowsBounds分页,分页插件
    Mybatis基础,日志工厂
    Mybatis基础一,生命周期,和作用域,resultMap(结果集映射)
    Mybatis配置解析三,typeAliases(别名),setting(设置)
    浅谈JPA
  • 原文地址:https://www.cnblogs.com/dealer/p/13264232.html
Copyright © 2011-2022 走看看