Advertisement
wym1111

Untitled

Oct 22nd, 2024
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. //#define int long long
  5. using ll = long long;
  6. const int N = 2e5 + 10;
  7. const ll INF = 0x3f3f3f3f;
  8.  
  9. // 动态dp
  10.  
  11. class Segment {
  12. private:
  13.     struct Node {
  14.         ll dp[2][2][2]; // 是否选择了最大值,左端点,右端点
  15.         void init () {
  16.             for (int i = 0; i < 2; i ++) {
  17.                 for (int j = 0; j < 2; j ++) {
  18.                     for (int k = 0; k < 2; k ++) {
  19.                         dp[i][j][k] = -INF;
  20.                     }
  21.                 }
  22.             }
  23.             dp[0][0][0] = 0;
  24.         }
  25.         void init (int v) {
  26.             for (int i = 0; i < 2; i ++) {
  27.                 for (int j = 0; j < 2; j ++) {
  28.                     for (int k = 0; k < 2; k ++) {
  29.                         dp[i][j][k] = -INF;
  30.                     }
  31.                 }
  32.             }
  33.             dp[0][0][0] = 0;
  34.             dp[0][1][1] = 1;
  35.             if (v) dp[1][1][1] = v + 1;
  36.         }
  37.     } node[N << 2];
  38. public:
  39. #define ls(p) node[p << 1]
  40. #define rs(p) node[p << 1 | 1]
  41.     void push_up (int p) {
  42.         node[p].init(0);
  43.         for (int a = 0; a < 2; a ++) {
  44.             for (int b = 0; b < 2; b ++) {
  45.                 int cur = max(a, b);
  46.                 for (int i = 0; i < 2; i ++) {
  47.                     for (int j = 0; j < 2; j ++) {
  48.                         for (int x = 0; j + x < 2; x ++) {
  49.                             for (int y = 0; y < 2; y ++) {
  50.                                 node[p].dp[cur][i][y] = max(node[p].dp[cur][i][y],
  51.                                     ls(p).dp[a][i][j] + rs(p).dp[b][x][y]);
  52.                             }
  53.                         }
  54.                     }
  55.                 }
  56.             }
  57.         }
  58.     }
  59.     void build (int s, int t, int p = 1) {
  60.         if (s == t) {
  61.             node[p].init();
  62.             return;
  63.         }
  64.         int mid = (s + t) >> 1;
  65.         build(s, mid, p << 1);
  66.         build(mid + 1, t, p << 1 | 1);
  67.         push_up(p);
  68.     }
  69.     void update (int x, int val, int s, int t, int p = 1) {
  70.         cout << "upd: " << x << ' ' << val << ' ' << s << ' ' << t << endl;
  71.         if (s == t) {
  72.             node[p].init(val);
  73.             return;
  74.         }
  75.         int mid = (s + t) >> 1;
  76.         if (x <= mid) update(x, val, s, mid, p << 1);
  77.         else update(x, val, mid + 1, t, p << 1 | 1);
  78.         push_up(p);
  79.     }
  80.     ll query () {
  81.         ll res = 0;
  82.         for (int i = 0; i < 2; i ++) {
  83.             for (int j = 0; j < 2; j ++) {
  84.                 res = max(res, node[1].dp[1][i][j]);
  85.             }
  86.         }
  87.         return res;
  88.     }
  89. };
  90. Segment seg;
  91.  
  92. int n;
  93. ll mx;
  94. pair<ll, int> a[N];
  95.  
  96. void init () {
  97.     cin >> n;
  98.    
  99.     mx = 0;
  100.     for (int i = 1; i <= n; i ++) {
  101.         ll cur;
  102.         cin >> cur;
  103.         mx = max(mx, cur);
  104.         a[i] = {cur, i};
  105.     }
  106. }
  107.  
  108. void solve () {
  109.     init();
  110.    
  111.     seg.build(1, n);
  112.     cout << seg.query() << endl;
  113.     sort(a + 1, a + 1 + n, [&](auto x, auto y){
  114.         return x.first > y.first;
  115.     });
  116.    
  117.     ll ans = 0;
  118.     for (int i = 1; i <= n; i ++) {
  119.         auto [val, id] = a[i];
  120.         seg.update(id, (val == mx ? val : 0), 1, n);
  121.         ans = max(ans, val + seg.query());
  122.         cout << id << ' ' << val << ' ' << seg.query() << endl;
  123.     }
  124.     cout << ans << endl;
  125. }
  126.  
  127. signed main () {
  128.     ios::sync_with_stdio(0);
  129.     cin.tie(0);
  130.    
  131.     int _ = 1;
  132.     cin >> _;
  133.     while (_ --) {
  134.         solve();
  135.     }
  136.    
  137.     return 0;
  138. }
  139.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement