Untitled
unknown
c_cpp
2 years ago
2.0 kB
5
Indexable
#include <bits/stdc++.h> #define F first #define S second #define pb push_back #define all(x) (x).begin(), (x).end() #define debug(x) cerr << #x << " = " << x << '\n'; #define int long long using namespace std; const int MAXN = 5e5 + 5; int n; int a[MAXN], mn[MAXN], mx[MAXN], cnt[MAXN * 2]; int dc(int l, int r) { if (l == r) return 1; int mid = (l + r) / 2; int res = dc(l, mid) + dc(mid + 1, r); mn[mid + 1] = mx[mid + 1] = a[mid + 1]; for (int i = mid + 2; i <= r; i++) { mn[i] = min(mn[i - 1], a[i]); mx[i] = max(mx[i - 1], a[i]); } mn[mid] = mx[mid] = a[mid]; for (int i = mid - 1; i >= l; i--) { mn[i] = min(mn[i + 1], a[i]); mx[i] = max(mx[i + 1], a[i]); } // min in left, max in left for (int i = mid; i >= l; i--) { int R = l + mx[i] - mn[i]; if (R > mid and R <= r and mx[R] < mx[i] and mn[R] > mn[i]) res++; } // min in right, max in right for (int i = mid + 1; i <= r; i++) { int L = r + mn[i] - mx[i]; if (L >= l and L <= mid and mx[L] < mx[i] and mn[L] > mn[i]) res++; } // max in left, min in right for (int i = mid, R = mid + 1, rr = mid + 1; i >= l; i--) { while (R <= r and mx[R] < mx[i]) cnt[R + mn[R]]++, R++; while (rr < R and mn[rr] > mn[i]) cnt[rr + mn[rr]]--, rr++; res += cnt[i + mx[i]]; } // init for (int i = mid + 1; i <= r; i++) cnt[i + mx[i]] = 0; // max in right, min in left for (int i = mid, R = mid + 1, rr = mid + 1; i >= l; i--) { while (R <= r and mn[R] > mn[i]) cnt[n - R + mx[R]]++, R++; while (rr < R and mx[rr] < mx[i]) cnt[n - rr + mx[rr]]--, rr++; res += cnt[n - i + mn[i]]; } // init for (int i = mid + 1; i <= r; i++) cnt[n - i + mn[i]] = 0; return res; } void solve() { int n; cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; cout << dc(1, n) << '\n'; } signed main() { int t; cin >> t; while (t--) solve(); }
Editor is loading...