【codeforces 19/11/27 div2】D. A Game with Traps

  1 #pragma warning(disable:4996)
  2 
  3 #include<iostream>
  4 #include<string>
  5 #include<queue>
  6 #include<stack>
  7 #include<vector>
  8 #include<map>
  9 #include<cstdio>
 10 #include<cstdlib>
 11 #include<algorithm>
 12 #include<set>
 13 #include<list>
 14 #include<iomanip>
 15 #include<cstring>
 16 #include<cmath>
 17 #include<limits>
 18 using namespace std;
 19 
 20 #define au auto
 21 #define debug(i) cout<<"<debug> "<<i<<" <\debug>"<<endl
 22 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
 23 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
 24 #define LLL __int128
 25 #define Re register
 26 #define il inline
 27 #define mem(a,b) memset(a,(b),sizeof(a))
 28 #define Design ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
 29 typedef pair<int, int> intpair;
 30 typedef pair<long long int, long long int> llpair;
 31 typedef long long int LL;
 32 const int INF = 0x3f3f3f3f;
 33 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
 34 
 35 const int maxn = 200010;
 36 int sol[maxn];
 37 int m, n, k, t;
 38 
 39 struct trap
 40 {
 41     int l, r;
 42     int d;
 43     trap() :l(0), r(0), d(0) {}
 44     trap(int a, int b, int c) :l(a), r(b), d(c) {}
 45     bool operator <(trap s)const
 46     {
 47         return d < s.d;
 48     }
 49 }tr[maxn];
 50 
 51 bool cmp(trap a, trap b)
 52 {
 53     if (a.l == b.l) return a.r < b.r;
 54     return a.l < b.l;
 55 }
 56 
 57 bool check(int x)
 58 {
 59     //debug("x: " << x << " sol[x]: " << sol[x]);
 60     if (tr[k].d <= sol[x]) return true;
 61     int low = 1;
 62     int high = k;
 63     while (low < high)
 64     {
 65         int mid = (low + high) >> 1;
 66         if (tr[mid].d <= sol[x]) low = mid + 1;
 67         else high = mid;
 68     }
 69     //debug("low: " << low);
 70     vector<trap>temp;
 71     mfor(i, low, k) temp.push_back(tr[i]);
 72     sort(temp.begin(), temp.end(), cmp);
 73     vector<intpair>res;
 74     int l, r;
 75     l = temp[0].l;
 76     r = temp[0].r;
 77     mfor(i, 1, temp.size() - 1)
 78     {
 79         if (temp[i].l <= r)
 80         {
 81             r = max(r, temp[i].r);
 82         }
 83         else
 84         {
 85             res.push_back(intpair(l, r));
 86             l = temp[i].l;
 87             r = temp[i].r;
 88         }
 89     }
 90     res.push_back(intpair(l, r));
 91     int sum = 0;
 92     for (auto it : res)
 93     {
 94         sum += it.second - it.first + 1;
 95     }
 96     //debug("sum: " << sum);
 97     return (sum << 1) + n < t;
 98 }
 99 
100 int main()
101 {
102     Design;
103     cin >> m >> n >> k >> t;
104     mfor(i, 1, m) cin >> sol[i];
105     sort(sol + 1, sol + 1 + m);
106     mfor(i, 1, k) cin >> tr[i].l >> tr[i].r >> tr[i].d;
107     sort(tr + 1, tr + 1 + k);
108     int l = 1;
109     int r = m;
110     while (l < r)
111     {
112         int mid = (l + r) >> 1;
113         if (!check(mid)) l = mid + 1;
114         else r = mid;
115     }
116     if (check(l)) cout << m - l + 1;
117     else cout << m - l;
118 }
View Code

猜你喜欢

转载自www.cnblogs.com/thjkhdf12/p/11959485.html
今日推荐