Submission #1185359

#TimeUsernameProblemLanguageResultExecution timeMemory
1185359UnforgettableplFancy Fence (CEOI20_fancyfence)C++20
100 / 100
27 ms5192 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int modulo = 1e9+7; struct UFDS{ vector<int> p,siz; int ans; UFDS(int n,vector<int> &w):p(n+1),ans(0){ siz = w; iota(p.begin(),p.end(),0); } int getRoot(int x){ return p[x]==x ? x : p[x]=getRoot(p[x]); } void unite(int a,int b){ a = getRoot(a); b = getRoot(b); if(a==b)return; if(siz[a]<siz[b])swap(a,b); ans+=siz[a]*siz[b]; ans%=modulo; siz[a]+=siz[b]; siz[a]%=modulo; p[b]=a; } }; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector<int> h(N+1),w(N+1); for(int i=1;i<=N;i++)cin>>h[i]; for(int i=1;i<=N;i++)cin>>w[i]; UFDS dsu(N,w); vector<pair<int,int>> blocks(N); for(int i=0;i<N;i++)blocks[i]={h[i+1],i+1}; sort(blocks.rbegin(),blocks.rend()); int ans = 0; vector<bool> added(N+2); for(int i=0;i<N;i++){ if(added[blocks[i].second+1])dsu.unite(blocks[i].second,blocks[i].second+1); if(added[blocks[i].second-1])dsu.unite(blocks[i].second,blocks[i].second-1); dsu.ans+=(w[blocks[i].second]*(w[blocks[i].second]+1))/2ll; dsu.ans%=modulo; added[blocks[i].second]=true; if(i==N-1 or blocks[i].first!=blocks[i+1].first){ ans += dsu.ans*(((blocks[i].first*(blocks[i].first+1))/2ll)%modulo); ans%=modulo; dsu.ans = 0; } } cout << ans << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...