Submission #1185358

#TimeUsernameProblemLanguageResultExecution timeMemory
1185358UnforgettableplFancy Fence (CEOI20_fancyfence)C++20
25 / 100
18 ms4936 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];
        p[b]=a;
        siz[a]%=modulo;
    }
};

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;
            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...