Advertisement
osipyonok

Decrement , get_i_val

Aug 10th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.64 KB | None | 0 0
  1. /*
  2.  
  3. Candles
  4. Time limit: 1000 ms
  5. Memory limit: 128 MB
  6.  
  7. You have N candles, for each candle i you know its height h_i. Using a candle during one evening decreases the candle height by 1.
  8.  
  9. You plan to have at most M romantic evenings. For each evening i you know the number of candles c_i​  you want to lit. Find of strategy of lighting the candles in order to maximize the number of evenings you can spend. You are forced to stop after the first night i when you can't light c_i candles.
  10.  
  11.  
  12. */
  13. #include<bits/stdc++.h>
  14.  
  15. #define INF 1000010000
  16. #define nl '\n'
  17. #define pb push_back
  18. #define ppb pop_back
  19. #define mp make_pair
  20. #define fi first
  21. #define se second
  22. #define pii pair<int,int>
  23. #define pdd pair<double,double>
  24. #define all(c) (c).begin(), (c).end()
  25. #define SORT(c) sort(all(c))
  26. #define sz(c) (c).size()
  27. #define rep(i,n) for( int i = 0; i < n; ++i )
  28. #define repi(i,n) for( int i = 1 ; i <= n; ++i )
  29. #define repn(i,n) for( int i = n - 1 ; i >= 0 ; --i )
  30. #define repf(j,i,n) for( int j = i ; j < n ; ++j )
  31. #define die(s) {std::cout << s << nl;}
  32. #define dier(s) {std::cout << s; return 0;}
  33. #define vi vector<int>
  34. typedef long long ll;
  35. #define MAXN 101010
  36. using namespace std;
  37.  
  38. vector<ll> t(2 * MAXN , 0);
  39. vector<ll> lazy(MAXN , 0);
  40.  
  41. int n , h;
  42.  
  43. void calc(int p , int k){
  44.     if(lazy[p] == 0){
  45.         t[p] = t[2 * p] + t[2 * p + 1];
  46.     }else{
  47.         t[p] += k * lazy[p];
  48.     }
  49. }
  50.  
  51. void apply(int p , ll val , int k){
  52.     t[p] += val;
  53.     if(p < n){
  54.         lazy[p] += val;
  55.     }
  56. }
  57.  
  58. void build(int l , int r){
  59.     int k = 2;
  60.     for(l += n , r += n - 1 ; l > 1 ; k *= 2){
  61.         l /= 2;
  62.         r /= 2;
  63.         for(int i = r ; i >= l ; --i){
  64.             calc(i , k);
  65.         }
  66.     }
  67. }
  68.  
  69. void push(int l , int r){
  70.     int s = h , k = 1 << (h - 1);
  71.     for(l += n , r += n - 1 ; s > 0 ; --s , k /= 2){
  72.         for(int i = l >> s ; i <= r >> s ; ++i){
  73.             if(lazy[i] != 0){
  74.                 apply(2 * i , lazy[i] , k);
  75.                 apply(2 * i + 1 , lazy[i] , k);
  76.                 lazy[i] = 0;
  77.             }
  78.         }
  79.     }
  80. }
  81.  
  82.  
  83.  
  84. void upd(int l , int r , ll val){
  85.     if(val == 0){
  86.         return;
  87.     }
  88.     push(l , l + 1);
  89.     push(r - 1 , r);
  90.     int l0 = l , r0 = r , k = 1;
  91.     for(l +=n , r += n ; l < r ; l/= 2 , r /= 2 , k *= 2){
  92.         if(l % 2){
  93.             apply(l , val , k);
  94.             ++l;
  95.         }
  96.         if(r % 2){
  97.             --r;
  98.             apply(r , val , k);
  99.         }
  100.     }
  101.     build(l0 , l0 + 1);
  102.     build(r0 - 1 , r0);
  103. }
  104.  
  105. ll query(int l , int r){
  106.     push(l , l + 1);
  107.     push(r - 1 , r);
  108.     ll res = 0;
  109.     for(l += n , r += n ; l < r ; l /= 2 , r /= 2){
  110.         if(l % 2){
  111.             res += 1LL * t[l];
  112.             ++l;
  113.         }
  114.         if(r % 2){
  115.             --r;
  116.             res += 1LL * t[r];
  117.         }
  118.     }
  119.     return res;
  120. }
  121.  
  122. ll query(int p){
  123.     return query(p , p + 1);
  124. }
  125.  
  126.  
  127. int main() {
  128.     ios_base::sync_with_stdio(false);
  129.     cin.tie(NULL);
  130.     cout.precision(0);
  131.    
  132.     int m;
  133.     cin >> n >> m;
  134.    
  135.     h = sizeof(int) * 8 - __builtin_clz(n);
  136.    
  137.     vi c(n);
  138.     rep(i , n){
  139.         cin >> c[i];
  140.     }
  141.    
  142.     SORT(c);
  143.     reverse(all(c));
  144.    
  145.     rep(i , n){
  146.         t[n + i] = c[i];
  147.     }
  148.    
  149.     build(0 , n);
  150.    
  151.     int ans = 0;
  152.    
  153.     rep(i , m){
  154.         int x;
  155.         cin >> x;
  156.        
  157.         int val = query(x - 1);
  158.        
  159.         if(val < 1)break;
  160.        
  161.         if(query(x) == val){
  162.             int l1 = 0 , r1 = x - 1;
  163.             if(query(0) != val){
  164.                 while(r1 - l1 > 1){
  165.                     int mid = (r1 + l1) / 2;
  166.                     if(query(mid) == val){
  167.                         r1 = mid;
  168.                     }else{
  169.                         l1 = mid;
  170.                     }
  171.                 }
  172.             }else{
  173.                 r1 = 0;
  174.             }
  175.            
  176.            
  177.             int l2 = x , r2 = n - 1;
  178.             if(query(n - 1) != val){
  179.                 while(r2 - l2 > 1){
  180.                     int mid = (r2 + l2) / 2;
  181.                     if(query(mid) == val){
  182.                         l2 = mid;
  183.                     }else{
  184.                         r2 = mid;
  185.                     }
  186.                 }
  187.             }else{
  188.                 l2 = n - 1;
  189.             }
  190.            
  191.             upd(0 , r1 , -1);
  192.            
  193.             x -= r1;
  194.            
  195.             upd(l2 - x + 1 , l2 + 1 , -1);
  196.         }else{
  197.             upd(0 , x , -1);
  198.         }
  199.        
  200.         ++ans;
  201.     }
  202.    
  203.    
  204.     cout << ans;
  205.  
  206.     return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement