Advertisement
YEZAELP

PROG-1138: หนังสือเวทมนตร์ (magicbook)

May 18th, 2021 (edited)
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int INF = 1e9;
  5. const int N = 1e5;
  6. using pi = pair <int, int>;
  7. int tree[1 << 19];
  8. pi ar[N+10];
  9. vector <int> pst;
  10. int sz;
  11.  
  12. int find_min(int x){
  13.     int l = 1, r = sz-1, mn = INF;
  14.     while(l <= r){
  15.         int mid = (l + r) / 2;
  16.         if(pst[mid] >= x){
  17.             mn = min(mn, mid);
  18.             r = mid - 1;
  19.         }
  20.         else l = mid + 1;
  21.     }
  22.     return mn;
  23. }
  24.  
  25. int find_max(int x){
  26.     int l = 1, r = sz-1, mx = -INF;
  27.     while(l <= r){
  28.         int mid = (l + r) / 2;
  29.         if(pst[mid] <= x){
  30.             mx = max(mx, mid);
  31.             l = mid + 1;
  32.         }
  33.         else r = mid - 1;
  34.     }
  35.     return mx;
  36. }
  37.  
  38. int find_x(int x){
  39.     int l = 1, r = sz-1;
  40.     while(l <= r){
  41.         int mid = (l + r) / 2;
  42.         if(pst[mid] == x) return mid;
  43.         else if(pst[mid] < x) l = mid + 1;
  44.         else r = mid - 1;
  45.     }
  46. }
  47.  
  48. int query(int idx, int l, int r, int s, int e){
  49.     if(l > e or r < s) return 0;
  50.     if(s <= l and r <= e) return tree[idx];
  51.     int mid = (l + r) / 2;
  52.     return max( query(2*idx, l, mid, s, e), query(2*idx+1, mid+1, r, s, e) );
  53. }
  54.  
  55. int update(int idx, int l, int r, int x, int a){
  56.     if(l == r) return tree[idx] = max(tree[idx], a); // dp
  57.     int mid = (l + r) / 2;
  58.     if(x <= mid) return tree[idx] = max( update(2*idx, l, mid, x, a), tree[2*idx+1]);
  59.     else return tree[idx] = max(tree[2*idx], update(2*idx+1, mid+1, r, x, a));
  60. }
  61.  
  62. int main(){
  63.  
  64.     int n, k, s;
  65.     scanf("%d%d%d", &n, &k, &s);
  66.  
  67.     for(int i=1;i<=n;i++){
  68.         int x, a;
  69.         scanf("%d%d", &x, &a);
  70.         pst.push_back(x);
  71.         ar[i] = {x, a};
  72.     }
  73.  
  74.     sort(pst.begin(), pst.end());
  75.     pst.resize( unique(pst.begin(), pst.end()) - pst.begin() );
  76.     pst.insert(pst.begin(), 0);
  77.     sz = pst.size();
  78.  
  79.     int ans = 0;
  80.     for(int i=1;i<=n;i++){
  81.         int x = ar[i].first;
  82.         int a = ar[i].second;
  83.         int l = find_min(x - k);
  84.         int r = find_max(x + k);
  85.         int mx = query(1, 1, sz-1, l, r);
  86.         if((mx == 0 and abs(x-s) <= k) or mx != 0) mx += a;
  87.         update(1, 1, sz-1, find_x(x), mx);
  88.         ans = max(ans, mx);
  89.     }
  90.  
  91.     printf("%d", ans);
  92.  
  93.     return 0;
  94. }
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement