RaFiN_

Permutation Separation cf-1295E

Jul 5th, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5.  
  6. const int N = 2e5 + 100;
  7.  
  8.  
  9. /**
  10.     1) Add X in a range
  11.     2) query for min in a range
  12. **/
  13.  
  14. long long inf = 1e18;
  15. long long tr[4*N], lz[4*N];
  16.  
  17. void propagate(int u, int st, int en) {
  18.     if (!lz[u]) return;
  19.     tr[u] += lz[u];
  20.     if (st!=en) {
  21.         lz[2*u] += lz[u];
  22.         lz[2*u+1] += lz[u];
  23.     }
  24.     lz[u] = 0;
  25. }
  26.  
  27. void update(int u, int st, int en, int l, int r, long long x) {
  28.     propagate(u, st, en);
  29.     if (r<st || en<l || l > r)  return;
  30.     else if (l<=st && en<=r) {
  31.         lz[u] += x;
  32.         propagate(u, st, en);
  33.     }
  34.     else {
  35.         int mid = (st+en)/2;
  36.         update(2*u, st, mid, l, r, x);
  37.         update(2*u+1, mid+1, en, l, r, x);
  38.         tr[u] = min(tr[2*u], tr[2*u+1]);
  39.     }
  40. }
  41.  
  42. long long query(int u, int st, int en, int l, int r) {
  43.     propagate(u, st, en);
  44.     if (r<st || en<l)  return inf;
  45.     else if (l<=st && en<=r) return tr[u];
  46.     else {
  47.         int mid = (st+en)/2;
  48.         return min(query(2*u, st, mid, l, r), query(2*u+1, mid+1, en, l, r));
  49.     }
  50. }
  51.  
  52. int a[N], pos[N], cost[N];
  53.  
  54. int main() {
  55.     int n;
  56.     cin >> n;
  57.     for(int i = 1; i <= n; i++) {
  58.         cin >> a[i];
  59.         pos[a[i]] = i;
  60.     }
  61.     for(int i = 1; i <= n; i++) {
  62.         cin >> cost[i];
  63.     }
  64.     for(int i = 1; i <= n; i++) {
  65.         update(1,1,n,pos[i],n,+cost[pos[i]]);
  66.     }
  67.     long long ans = query(1,1,n,1,n-1);
  68.     for(int i = 1; i <= n; i++) {
  69.         update(1,1,n,pos[i],n,-cost[pos[i]]);
  70.         update(1,1,n,1,pos[i]-1,+cost[pos[i]]);
  71.         ans = min(ans, query(1,1,n,1,n-1));
  72.     }
  73.     cout << ans << endl;
  74. }
Add Comment
Please, Sign In to add comment