willy108

Waku Waku Abyss Model Solution

Nov 10th, 2022
1,176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. template<typename T>
  5. struct MinDeque {
  6.     int l = 0, r = 0;
  7.     deque<pair<T, int>> dq;
  8.  
  9.     void push(T x) {
  10.         while (!dq.empty() && x <= dq.back().first)
  11.             dq.pop_back();
  12.         dq.emplace_back(x, r++);
  13.     }
  14.  
  15.     void pop() {
  16.         assert(l < r);
  17.         if (dq.front().second == l++)
  18.             dq.pop_front();
  19.     }
  20.  
  21.     T min() {
  22.         assert(!dq.empty());
  23.         return dq.front().first;
  24.     }
  25. };
  26.  
  27. int main() {
  28.     ios_base::sync_with_stdio(false);
  29.     cin.tie(NULL);
  30.  
  31.     int t;
  32.     cin >> t;
  33.     while (t--) {
  34.         int n, m;
  35.         cin >> n >> m;
  36.         vector<int> a(n);
  37.         for (int i=1; i<n; i++) {
  38.             cin >> a[i];
  39.             a[i] ^= a[i-1];
  40.         }
  41.  
  42.         vector<int> dp(n, 1e9);
  43.         dp[0] = 0;
  44.         while (m--) {
  45.             int s, e, l;
  46.             cin >> s >> e >> l;
  47.             s--, e--;
  48.  
  49.             vector<int> ndp(n);
  50.             vector<MinDeque<int>> dq(1 << 5);
  51.             for (int i=0; i<n; i++) {
  52.                 ndp[i] = dp[i];
  53.                 if (s <= i && i <= e) {
  54.                     for (int mask=0; mask<1<<5; mask++)
  55.                         if (!dq[mask].dq.empty())
  56.                             ndp[i] = min(ndp[i], dq[mask].min() + (a[i] ^ mask) - 16);
  57.                     dq[a[i]].push(dp[i]);
  58.                 }
  59.                 if (i >= l && s <= i - l && i - l <= e)
  60.                     dq[a[i-l]].pop();
  61.             }
  62.             dp = move(ndp);
  63.         }
  64.         cout << dp[n-1] << "\n";
  65.     }
  66.  
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment