【codeforces 19/11/13 div2】D. Yet Another Monster Killing Problem

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 using namespace std;
 7  
 8 const int INF = 0x3f3f3f3f;
 9 const int maxn = 200010;
10 int a[maxn];
11 int mon[maxn];
12 int ed[maxn];
13 int maxh[maxn];
14 int n, m;
15 vector<pair<int, int> >temp;
16  
17 bool operator <(pair<int, int>a, pair<int, int>b)
18 {
19     if (a.first == b.first) return a.second < b.second;
20     return a.first < b.first;
21 }
22  
23 int main()
24 {
25     int T;
26     scanf("%d",&T);
27     while (T--)
28     {
29         temp.clear();
30         scanf("%d",&n);
31         for (int i = 1; i <= n; i++)
32         {
33            scanf("%d",&mon[i]);
34         }
35         scanf("%d",&m);
36         for (int i = 1; i <= m; i++)
37         {
38             int a, b;
39             scanf("%d%d",&a,&b);
40             temp.push_back(pair<int, int>(b, a));
41         }
42         sort(temp.begin(), temp.end());
43         for (int i = 0; i < m; i++)
44         {
45             a[i + 1] = temp[i].second;
46             ed[i + 1] = temp[i].first;
47         }
48         {
49         int maxh = *max_element(a + 1, a + 1 + m);
50         int maxm = *max_element(mon + 1, mon + n + 1);
51         if (maxh < maxm)
52         {
53             //有怪谁也打不过,AK无望
54             printf("-1\n");
55             continue;
56         }
57         }
58         maxh[m]=a[m];
59         for(int i=m-1;i>0;i--)
60         {
61             maxh[i]=max(maxh[i+1],a[i]);
62         }
63         int d = 0;    //当天击败数量
64         int ans = 1;
65         int maxp = -INF;
66         for (int i = 1; i <= n; i++)
67         {
68             d++;
69             maxp = max(maxp, mon[i]);    //目前为止今天计划中最强的怪
70             int val = lower_bound(ed + 1, ed + 1 + m, d) - ed;    //当前耐力还能继续打下去的英雄
71             int maxq = -INF;
72             if (val < m + 1) maxq = maxh[val];    //耐力值足够,在当前耐力值足够的英雄里找最能打的
73             if (val == m + 1 || maxq < maxp)
74             {    //没有耐力足够的英雄打的过计划今天要打的怪里最强的
75                 ans++;
76                 d = 1;    //用战力比这个怪强的英雄K掉这个怪
77                 maxp = mon[i];    //这个怪安排到下一天
78                 //进入下一天
79             }
80         }
81         printf("%d\n",ans);
82     }
83     return 0;
84 }
View Code

 

posted on 2019-11-14 14:45  thjkhdf12  阅读(161)  评论(0)    收藏  举报