제출 #1132020

#제출 시각아이디문제언어결과실행 시간메모리
1132020vladiliusFlooding Wall (BOI24_wall)C++20
70 / 100
2669 ms1114112 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define pb push_back #define ff first #define ss second const int mod = 1e9 + 7; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; vector<int> a(n + 1); for (int i = 1; i <= n; i++){ cin>>a[i]; } vector<int> b(n + 1); for (int i = 1; i <= n; i++){ cin>>b[i]; } vector<int> tw(n + 1); tw[0] = 1; for (int i = 1; i < n; i++) tw[i] = (2 * tw[i - 1]) % mod; for (int i = 1; i <= n; i++){ if (a[i] > b[i]){ swap(a[i], b[i]); } } ll out = 0; for (int i = 1; i <= n; i++){ out = (out - 1LL * tw[n - 1] * (a[i] + b[i])) % mod; } vector<pii> f; for (int i = 1; i <= n; i++){ f.pb({a[i], i}); f.pb({b[i], -i}); } sort(f.begin(), f.end()); vector<int> act = {0}; int i = 0, m = 0; while (i < f.size()){ int j = i; m++; act.pb(f[i].ff); while (j < f.size() && f[i].ff == f[j].ff){ int t = f[j].ss; if (t > 0) a[t] = m; else b[-t] = m; j++; } i = j; } vector<int> log(n + 1); for (int i = 2; i <= n; i++) log[i] = log[i / 2] + 1; const int lg = log[n]; vector<vector<int>> sp(n + 1, vector<int>(lg + 1)); for (int i = 1; i <= n; i++) sp[i][0] = a[i]; for (int j = 1; j <= lg; j++){ for (int i = 1; i + (1 << j) <= n + 1; i++){ sp[i][j] = max(sp[i][j - 1], sp[i + (1 << (j - 1))][j - 1]); } } vector<vector<int>> p(m + 1, vector<int>(n + 1)); for (int x = 1; x <= m; x++){ for (int i = 1; i <= n; i++){ p[x][i] = p[x][i - 1] + (b[i] <= x); } } auto get1 = [&](int l, int r, int x){ if (l > r) return 1; int k = log[r - l + 1]; if (max(sp[l][k], sp[r - (1 << k) + 1][k]) > x) return 0; return tw[p[x][r] - p[x][l - 1]]; }; auto get2 = [&](int l, int r, int x){ return tw[r - l + 1] - get1(l, r, x - 1); }; vector<int> all1; for (int i = 1; i <= n; i++){ all1.pb(a[i]); all1.pb(b[i]); } sort(all1.begin(), all1.end()); vector<int> all; for (int j = 0; j < all1.size(); j++){ if (!j || all1[j - 1] != all1[j]){ all.pb(all1[j]); } } for (int i = 1; i <= n; i++){ for (int j: all){ if (a[i] == j){ out += ((1LL * act[j] * get1(1, i - 1, j)) % mod * tw[n - i]) % mod; out += (((1LL * act[j] * get1(i + 1, n, j)) % mod) * get2(1, i - 1, j + 1)) % mod; } else if (a[i] < j){ out += (((1LL * act[j] * (get1(1, i - 1, j) - get1(1, i - 1, j - 1))) % mod) * get2(i + 1, n, j)) % mod; out += (((1LL * act[j] * (get1(i + 1, n, j) - get1(i + 1, n, j - 1))) % mod) * get2(1, i - 1, j + 1)) % mod; } if (b[i] == j){ out += ((1LL * act[j] * get1(1, i - 1, j)) % mod * tw[n - i]) % mod; out += (((1LL * act[j] * get1(i + 1, n, j)) % mod) * get2(1, i - 1, j + 1)) % mod; } else if (b[i] < j){ out += (((1LL * act[j] * (get1(1, i - 1, j) - get1(1, i - 1, j - 1))) % mod) * get2(i + 1, n, j)) % mod; out += (((1LL * act[j] * (get1(i + 1, n, j) - get1(i + 1, n, j - 1))) % mod) * get2(1, i - 1, j + 1)) % mod; } } out %= mod; } if (out < 0) out += mod; cout<<out<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...