Submission #328717

#TimeUsernameProblemLanguageResultExecution timeMemory
328717dolphingarlicFancy Fence (CEOI20_fancyfence)C++14
100 / 100
86 ms21880 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; const ll MOD = 1e9 + 7; int n, m = 0; ll h[100002], w[100002]; ll node_h[100002], node_w[100002], ans = 0; pair<ll, int> srt[100002]; int cmp[100002], nd[100002], cnt = 0; set<int> graph[100002]; int find(int A) { while (A != cmp[A]) cmp[A] = cmp[cmp[A]], A = cmp[A]; return A; } void onion(int A, int B) { if (find(A) == find(B)) return; node_w[nd[find(B)]] += node_w[nd[find(A)]]; if (node_w[nd[find(B)]] >= MOD) node_w[nd[find(B)]] -= MOD; graph[nd[find(B)]].insert(nd[find(A)]); nd[find(A)] = nd[find(B)]; cmp[find(A)] = cmp[find(B)]; } ll c2(ll num) { return num * (num - 1) % MOD * 500000004 % MOD; } void dfs(int node, ll depth, ll prv = 0) { ans += c2(node_w[node] + 1) * (c2(depth - prv + 1) + (depth - prv) * prv % MOD) % MOD; if (ans >= MOD) ans -= MOD; for (int i : graph[node]) dfs(i, node_h[i], depth); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> h[i]; srt[i] = {h[i], i}; } for (int i = 1; i <= n; i++) cin >> w[i]; sort(srt + 1, srt + n + 1, greater<pair<ll, int>>()); iota(cmp + 1, cmp + n + 1, 1); for (int i = 1, j = 1; i <= n; i = j) { while (j <= n && srt[j].first == srt[i].first) j++; for (int k = i; k < j; k++) { int x = srt[k].second; if (k == i || find(x) != find(srt[k - 1].second)) { nd[x] = ++cnt; node_h[cnt] = h[x]; node_w[cnt] = w[x]; } else { node_w[cnt] += w[x]; if (node_w[cnt] >= MOD) node_w[cnt] -= MOD; } if (h[x] < h[x + 1]) onion(x + 1, x); if (h[x] <= h[x - 1]) onion(x - 1, x); } } dfs(cnt, node_h[cnt]); 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...
#Verdict Execution timeMemoryGrader output
Fetching results...