Advertisement
YEZAELP

PROG-1052: Domino

Oct 9th, 2021
713
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int INF = 1e9;
  5. const int N = 1e5 + 10;
  6. int X[N], H[N], dp[3][N]; /// 1 r, 2 l
  7. vector < vector <int>> tree(3, vector <int> (1 << 19, -INF));
  8. int n;
  9.  
  10. int Update(int idx, int l, int r, int side, int pst, int val){
  11.     if(l == r) return tree[side][idx] = val;
  12.     int mid = (l + r) / 2;
  13.     if(pst <= mid)
  14.         return tree[side][idx] = max( Update(2 * idx, l, mid, side, pst, val), tree[side][2 * idx + 1] );
  15.     return tree[side][idx] = max( tree[side][2 * idx], Update(2 * idx + 1, mid + 1, r, side, pst, val) );
  16. }
  17.  
  18. int Query(int idx, int l, int r, int side, int s, int e){
  19.     if(r < s or l > e) return -INF;
  20.     if(s <= l and r <= e) return tree[side][idx];
  21.     int mid = (l + r) / 2;
  22.     return max( Query(2 * idx, l, mid, side, s, e), Query(2 * idx + 1, mid + 1, r, side, s, e) );
  23. }
  24.  
  25. int MaxPst(int l, int val){
  26.     int r = n, mx = l;
  27.     while(l <= r){
  28.         int mid = (l + r) / 2;
  29.         if(val > X[mid]) mx = max(mx, mid), l = mid + 1;
  30.         else r = mid - 1;
  31.     }
  32.     return mx;
  33. }
  34.  
  35. int MinPst(int r, int val){
  36.     int l = 1, mn = r;
  37.     while(l <= r){
  38.         int mid = (l + r) / 2;
  39.         if(val < X[mid]) mn = min(mn, mid), r = mid - 1;
  40.         else l = mid + 1;
  41.     }
  42.     return mn;
  43. }
  44.  
  45. int main(){
  46.  
  47.     scanf("%d", &n);
  48.  
  49.     for(int i=1;i<=n;i++){
  50.         scanf("%d%d", &X[i], &H[i]);
  51.     }
  52.  
  53.     /// r
  54.     for(int i=n;i>=1;i--){
  55.         int s = i;
  56.         int e = MaxPst(i, X[i] + H[i]);
  57.         if(e - s + 1 == 1) dp[1][i] = 1;
  58.         else dp[1][i] = Query(1, 1, n, 1, s, e) - i;
  59.         Update(1, 1, n, 1, i, dp[1][i] + i);
  60.     }
  61.  
  62.     /// l
  63.     for(int i=1;i<=n;i++){
  64.         int s = MinPst(i, X[i] - H[i]);
  65.         int e = i;
  66.         if(e - s + 1 == 1) dp[2][i] = 1;
  67.         else dp[2][i] = Query(1, 1, n, 2, s, e) + i;
  68.         Update(1, 1, n, 2, i, dp[2][i] - i);
  69.     }
  70.  
  71.     int mxR = 0, pstR = 0, mxL = 0, pstL = 0;
  72.     for(int i=1;i<=n;i++){
  73.         if(dp[1][i] > mxR) mxR = dp[1][i], pstR = i;
  74.         if(dp[2][i] > mxL) mxL = dp[2][i], pstL = i;
  75.     }
  76.  
  77.     if(mxR > mxL) printf("%d R", pstR);
  78.     else if(mxL > mxR) printf("%d L", pstL);
  79.     else if(pstL == pstR) printf("%d L", pstL); /// mxl == mxr
  80.     else if(pstL < pstR) printf("%d L", pstL);
  81.     else printf("%d R", pstR);
  82.  
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement