Advertisement
BaoJIaoPisu

Untitled

Nov 5th, 2022
719
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. using ll = long long;
  6. using ld = long double;
  7. using ull = unsigned long long;
  8.  
  9. using pii = pair<int, int>;
  10. using pll = pair<ll, ll>;
  11. using pld = pair<ld, ld>;
  12.  
  13. #define fi first
  14. #define se second
  15. #define pb push_back
  16. #define pf push_front
  17. #define mp make_pair
  18. #define ins insert
  19. #define btpc __builtin_popcount
  20. #define btclz __builtin_clz
  21.  
  22. #define sz(x) (int)(x.size());
  23. #define all(x) x.begin(), x.end()
  24. #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  25.  
  26. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  27.  
  28. int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
  29. int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
  30. int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
  31.  
  32. template<class X, class Y>
  33.     bool minimize(X &x, const Y &y) {
  34.         if (x > y)
  35.         {
  36.             x = y;
  37.             return true;
  38.         }
  39.         return false;
  40.     }
  41. template<class X, class Y>
  42.     bool maximize(X &x, const Y &y) {
  43.         if (x < y)
  44.         {
  45.             x = y;
  46.             return true;
  47.         }
  48.         return false;
  49.     }
  50.  
  51. const int MOD = 1e9 + 7; //998244353
  52.  
  53. template<class X, class Y>
  54.     void add(X &x, const Y &y) {
  55.         x = (x + y);
  56.         if(x >= MOD) x -= MOD;
  57.     }
  58.  
  59. template<class X, class Y>
  60.     void sub(X &x, const Y &y) {
  61.         x = (x - y);
  62.         if(x < 0) x += MOD;
  63.     }
  64.  
  65. /* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/
  66.  
  67. const ll INF = 1e18;
  68. const int N = 4e3 + 10;
  69.  
  70. ll dp[N][N];
  71. int opt[N][N], optL[N][N], optR[N][N];
  72. ll c[N], w[N], pref[N];
  73. vector<int> ans;
  74.  
  75. ll f(int l, int r) {
  76.     if(l > r) return 0;
  77.     if(l == r) return dp[l][r] = c[l];
  78.     if(dp[l][r] != -1) return dp[l][r];
  79.  
  80.     dp[l][r] = INF;
  81.     for(int i = r; i >= l; i--) {
  82.         ll cost = c[i] + pref[r] - pref[l - 1] - w[i];
  83.         maximize(cost, f(i + 1, r));
  84.         maximize(cost, f(l, i - 1));
  85.         if(minimize(dp[l][r], cost)) opt[l][r] = i;
  86.     }
  87.  
  88.     return dp[l][r];
  89. }
  90.  
  91. void dfs(int l, int r) {
  92.     if(l == r) {
  93.         ans.pb(l);
  94.         return;
  95.     }
  96.  
  97.     int pos = opt[l][r];
  98.     ans.pb(pos);
  99.     if(pos > l) dfs(l, pos - 1);
  100.     if(pos < r) dfs(pos + 1, r);
  101. }
  102.  
  103. void dfs2(int l, int r) {
  104.     if(l == r) {
  105.         ans.pb(l);
  106.         return;
  107.     }
  108.  
  109.     for(int i = r; i >= l; i--) {
  110.         ll cost = c[i] + pref[r] - pref[l - 1] - w[i];
  111.         if(i < r) maximize(cost, dp[i + 1][r]);
  112.         if(i > l) maximize(cost, dp[l][i - 1]);
  113.  
  114.         if(cost == dp[l][r]) {
  115.             ans.pb(i);
  116.             if(i > l) dfs2(l, i - 1);
  117.             if(i < r) dfs2(i + 1, r);
  118.             return;        
  119.         }
  120.     }
  121. }
  122.  
  123. void solve() {
  124.     int n; cin >> n;
  125.     for(int i = 1; i <= n; i++) cin >> c[i];
  126.     for(int i = 1; i <= n; i++) cin >> w[i];
  127.     for(int i = 1; i <= n; i++) pref[i] = pref[i - 1] + w[i];
  128.  
  129.     if(n <= 400) {
  130.         for(int i = 1; i <= n; i++) {
  131.             for(int j = 1; j <= n; j++) dp[i][j] = -1;
  132.         }
  133.  
  134.         cout << f(1, n) << '\n';
  135.         dfs(1, n);
  136.         for(auto x : ans) cout << x << " ";
  137.         return;
  138.     }
  139.  
  140.     if(n <= 4e3) {
  141.         //Knuth : f[i][j - 1] <= f[i][j] <= f[i + 1][j];
  142.         for(int i = 1; i <= n; i++) {
  143.             for(int j = 1; j <= n; j++) dp[i][j] = INF;
  144.             dp[i][i] = c[i];
  145.             opt[i][i] = optL[i][i] = optR[i][i] = i;
  146.         }
  147.  
  148.         for(int len = 2; len <= n; len++) {
  149.             for(int l = 1; l + len - 1 <= n; l++) {
  150.                 int r = l + len - 1;
  151.                 for(int pos = optR[l + 1][r]; pos >= optL[l][r - 1]; pos--) {
  152.                     ll cost = c[pos] + pref[r] - pref[l - 1] - w[pos];
  153.                     if(pos < r) maximize(cost, dp[pos + 1][r]);
  154.                     if(pos > l) maximize(cost, dp[l][pos - 1]);
  155.                     if(minimize(dp[l][r], cost)) optR[l][r] = pos;
  156.                     if(cost == dp[l][r]) optL[l][r] = pos;
  157.                 }
  158.             }
  159.         }
  160.  
  161.         cout << dp[1][n] << "\n";
  162.         dfs2(1, n);
  163.         for(auto x : ans) cout << x << " ";
  164.         return;
  165.     }
  166. }
  167.  
  168. int main()
  169. {
  170.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  171.     #ifndef ONLINE_JUDGE
  172.     freopen("input.txt", "r", stdin);
  173.     freopen("output.txt", "w", stdout);
  174.     #else
  175.     //online
  176.     freopen("QBST.inp", "r", stdin);
  177.     freopen("QBST.out", "w", stdout);
  178.     #endif
  179.  
  180.     int tc = 1, ddd = 0;
  181.     // cin >> tc;
  182.     while(tc--) {
  183.         //ddd++;
  184.         //cout << "Case #" << ddd << ": ";
  185.         solve();
  186.     }
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement