Advertisement
willy108

XJOI_1399_2.cpp

Jun 1st, 2020
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <cmath>
  7. #include <cassert>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <string>
  11. #include <map>
  12. #include <set>
  13. #include <sstream>
  14. #include <list>
  15. #include <unordered_map>
  16. #include <unordered_set>
  17. #include <functional>
  18.  
  19. #define max_v 210000
  20. #define int_max 0x3f3f3f3f
  21. #define cont continue
  22. #define byte_max 0x3f
  23. #define pow_2(n) (1 << n)
  24. #define LOG2(n) ((int)ceil(log2(n)))
  25. using namespace std;
  26.  
  27. void setIO(const string& file_name){
  28.     freopen((file_name+".in").c_str(), "r", stdin);
  29.     freopen((file_name+".out").c_str(), "w+", stdout);
  30. }
  31.  
  32. int d[max_v * 2], add[max_v * 2];
  33.  
  34. class seg_tree{
  35.   int s, n;
  36.   void A(int l, int r, int k, int L, int R, int val){
  37.     if(R <= L || R <= l || r <= L) return ;
  38.     int lc = k*2 + 1, rc = k*2 + 2, mid = (L + R)/2;
  39.     if(l <= L && R <= r){
  40.       add[k] += val;
  41.     }else{
  42.       A(l, r, lc, L, mid, val);
  43.       A(l, r, rc, mid, R, val);
  44.       d[k] = min(d[lc] + add[lc], d[rc] + add[rc]);
  45.     }
  46.  
  47.   }
  48.  
  49.   int Q_min(int l, int r, int k, int L, int R){
  50.     //printf("%d %d %d %d %d\n", l, r, k, L, R);
  51.     if(R <= l || r <= L) return int_max;
  52.     if(l <= L && R <= r) return d[k] + add[k];
  53.    
  54.     int lc = k*2 + 1, rc = k*2 + 2, mid = (L + R)/2;
  55.     return add[k] + min(Q_min(l, r, lc, L, mid), Q_min(l, r, rc, mid, R));
  56.   }
  57.  
  58.   public:
  59.     seg_tree(int s, int* arr){
  60.       this->n = pow_2(LOG2(s));
  61.       memset(d, 0x3f, sizeof(d));
  62.       for(int i = n - 1; i<n + s - 1; i++){
  63.         d[i] = arr[i - (n - 1)];
  64.       }
  65.        
  66.       for(int i = n - 2; i>= 0; i--){
  67.         d[i] = min(d[i*2 + 1], d[i*2 + 2]);
  68.       }
  69.     }
  70.    
  71.     void range_update(int l, int r, int val){
  72.       A(l, r, 0, 0, n, val);
  73.     }
  74.    
  75.     int query_min(int l, int r){
  76.       return Q_min(l, r, 0, 0, n);
  77.     }
  78.  
  79.     void print_all(){
  80.       for(int i = 0; i<n*2 ; i++)
  81.         printf("%d ", d[i]);
  82.       puts("");
  83.     }
  84. };
  85.  
  86.  
  87. struct interval{
  88.   int start, end, dur;
  89.   interval(int a, int b){
  90.     start = a, end = b, dur = b - a;
  91.   }
  92.  
  93.   interval(){}
  94.  
  95.   bool operator < (const interval& b) const{
  96.     if(end == b.end)
  97.         return dur < b.dur;
  98.     return end < b.end;
  99.   }
  100. };
  101.  
  102. vector<interval> intervals;
  103. int arr[max_v];
  104. int main(){
  105.   int n, q;
  106.   scanf("%d%d", &n, &q);
  107.   for(int i = 0; i<n; i++)
  108.     scanf("%d", &arr[i]);
  109.  
  110.   while(q--){
  111.     int a, b;
  112.     scanf("%d%d", &a, &b);
  113.     a--;
  114.    
  115.     intervals.push_back(interval(a, b));
  116.   }
  117.  
  118.   sort(intervals.begin(), intervals.end());
  119.   seg_tree S(n, arr);
  120.   //S.print_all();
  121.   int total = 0;
  122.  
  123.   for(int i = 0; i<intervals.size(); i++){
  124.     int a = intervals[i].start, b = intervals[i].end;
  125.     //printf("%d %d\n", a, b);
  126.  
  127.     if(S.query_min(a, b) == 0) cont;
  128.     total++;
  129.     S.range_update(a, b, -1);
  130.     //printf("TAKE\n");
  131.     //S.print_all();
  132.   }
  133.    
  134.   printf("%d\n", total);
  135.  
  136.  
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement