Submission #478310

#TimeUsernameProblemLanguageResultExecution timeMemory
478310Haruto810198Fancy Fence (CEOI20_fancyfence)C++17
100 / 100
62 ms10172 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define double long double #define FOR(i, l, r, d) for(int i=(l); i<=(r); i+=(d)) #define szof(x) ((int)(x).size()) #define vi vector<int> #define pii pair<int, int> #define F first #define S second #define pb push_back #define eb emplace_back #define mkp make_pair const int INF = 2147483647; const int LNF = INF*INF; const int MOD = 1000000007; const int mod = 998244353; const double eps = 1e-12; //#pragma GCC optimize("Ofast") //#pragma GCC optimize("unroll-loops") const int MAX = 100010; int n; int h[MAX], w[MAX]; bool vis[MAX]; int p[MAX], dep[MAX]; int wsum[MAX], l[MAX], r[MAX]; int res; int findp(int v){ if(v == p[v]) return v; return p[v] = findp(p[v]); } void uni(int u, int v){ int pu = findp(u); int pv = findp(v); if(pu == pv) return; if(dep[pu] < dep[pv]) swap(pu, pv); p[pv] = pu; if(dep[pu] > dep[pv]) dep[pu]++; wsum[pu] += wsum[pv]; l[pu] = min(l[pu], l[pv]); r[pu] = max(r[pu], r[pv]); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); //freopen("fancyfence_sample.txt", "r", stdin); cin>>n; FOR(i, 1, n, 1){ cin>>h[i]; } FOR(i, 1, n, 1){ cin>>w[i]; } FOR(i, 1, n, 1){ vis[i] = 0; p[i] = i; dep[i] = 0; wsum[i] = w[i]; l[i] = r[i] = i; } vector<pii> owo; FOR(i, 1, n, 1){ owo.eb(h[i], i); } sort(owo.begin(), owo.end()); reverse(owo.begin(), owo.end()); for(pii i : owo){ int id = i.S; vis[id] = 1; if(vis[id - 1]) uni(id - 1, id); if(vis[id + 1]) uni(id, id + 1); int U = h[id]; int D = max(h[l[findp(id)] - 1], h[r[findp(id)] + 1]) + 1; int W = wsum[findp(id)] % MOD; res += (((U + D) * (U - D + 1) / 2) % MOD) * ((W * (W + 1) / 2) % MOD); res %= MOD; //cerr<<"U = "<<U<<", D = "<<D<<", res += "<<(((U + D) * (U - D + 1) / 2) % MOD) * ((W * (W + 1) / 2) % MOD)<<endl; } cout<<res<<'\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...