제출 #1215314

#제출 시각아이디문제언어결과실행 시간메모리
1215314biankFlooding Wall (BOI24_wall)C++20
100 / 100
958 ms87100 KiB
#include <bits/stdc++.h> using namespace std; #define forn(i,n) for(int i=0;i<int(n);i++) #define forsn(i,s,n) for(int i=int(s);i<int(n);i++) #define dforn(i,n) for(int i=int(n)-1;i>=0;i--) #define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--) #define fst first #define snd second #define pb push_back #define eb emplace_back #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() typedef long long ll; typedef vector<ll> vll; typedef vector<int> vi; typedef pair<int,int> ii; const int MOD = 1e9 + 7; void add(int &x, int v) { if ((x += v) >= MOD) x -= MOD; } void sub(int &x, int v) { if ((x -= v) < 0) x += MOD; } int mul(int a, int b) { return int(1LL * a * b % MOD); } int binpow(int a, int k) { int r = 1; while (k > 0) { if (k % 2 == 1) r = mul(r, a); a = mul(a, a), k /= 2; } return r; } const int MOD_INV_2 = binpow(2, MOD - 2); const int SZ = 1 << 20; ii st[2 * SZ]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<vi> x(2, vi(n)); forn(i, 2) forn(j, n) { cin >> x[i][j]; } vi pot(n + 1); pot[0] = 1; forn(i, n) { pot[i + 1] = pot[i]; add(pot[i + 1], pot[i]); } vi vals(2 * n); forn(i, 2) forn(j, n) vals[2 * j + i] = x[i][j]; sort(all(vals)); vals.erase(unique(all(vals)), end(vals)); vector<vi> where(sz(vals)); forn(t, 2) forn(i, n) { int pos = int(lower_bound(all(vals), x[t][i]) - begin(vals)); where[pos].pb(i); } vi ret(sz(vals)); vi m; auto init = [&]() { m.assign(n, 2); forn(i, 2 * SZ) { st[i] = {0, 1}; } forn(i, n) st[i + SZ] = {0, m[i]}; dforsn(u, 1, SZ) { st[u].fst = st[2 * u].fst; add(st[u].fst, mul(st[2 * u].snd, st[2 * u + 1].fst)); st[u].snd = mul(st[2 * u].snd, st[2 * u + 1].snd); } }; init(); dforn(i, sz(vals)) { for (int j : where[i]) { m[j]--; st[j + SZ] = {mul(mul(2 - m[j], j), pot[n - j - 1]), m[j]}; for (int u = j + SZ; u /= 2;) { st[u].fst = st[2 * u].fst; add(st[u].fst, mul(st[2 * u].snd, st[2 * u + 1].fst)); st[u].snd = mul(st[2 * u].snd, st[2 * u + 1].snd); } } sub(ret[i], st[1].fst); } init(); dforn(i, sz(vals)) { for (int j : where[i]) { m[j]--; st[n - j - 1 + SZ] = {mul(mul(2 - m[j], j + 1), pot[j]), m[j]}; for (int u = n - j - 1 + SZ; u /= 2;) { st[u].fst = st[2 * u].fst; add(st[u].fst, mul(st[2 * u].snd, st[2 * u + 1].fst)); st[u].snd = mul(st[2 * u].snd, st[2 * u + 1].snd); } } add(ret[i], st[1].fst); } int ans = 0; forn(i, sz(vals)) { int curr = ret[i], h = vals[i]; if (i + 1 < sz(vals)) sub(curr, ret[i + 1]); add(ans, mul(h, curr)); } int sum = 0; forn(i, 2) forn(j, n) add(sum, x[i][j]); sub(ans, mul(pot[n - 1], sum)); cout << ans << '\n'; return 0; }
#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...