Submission #1127584

#TimeUsernameProblemLanguageResultExecution timeMemory
1127584WarinchaiSightseeing in Kyoto (JOI22_kyoto)C++20
100 / 100
125 ms17072 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x[100005];
int y[100005];
int p[200005];
int fp(int a){return p[a]==a?a:p[a]=fp(p[a]);}
int un(int a,int b){return p[fp(b)]=fp(a);}
int ver[200005];
int ans=0;
struct node{
    int sum,freq;
    node(int _sum=0,int _freq=0){
        sum=_sum,freq=_freq;
    }
    friend bool operator<(node a,node b){
        return (a.sum*b.freq)>(b.sum*a.freq);
    }
    friend node operator+(node a,node b){
        ans+=a.sum*b.freq;
        //cerr<<"add:"<<a.sum<<"*"<<b.freq<<"\n";
        return node(a.sum+b.sum,a.freq+b.freq);
    }
};
node info[200005];
int pa[200005];
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int h,w;cin>>h>>w;
    for(int i=1;i<=h;i++)cin>>x[i];
    for(int i=1;i<=w;i++)cin>>y[i];
    ans+=x[1]*(w-1)+y[1]*(h-1);
    priority_queue<pair<node,pair<int,int>>>pq;
    for(int i=1;i<=h+w;i++)p[i]=i;
    for(int i=2;i<=h;i++){
        info[i]=node(x[i]-x[i-1],1);
        pa[i]=i-1;
        pq.push({info[i],{i,++ver[i]}});
        ans-=(x[i]-x[i-1])*(h-i);
    }
    for(int i=1;i<w;i++){
        info[h+i]=node(y[i+1]-y[i],1);
        pa[h+i]=(i==1?1:h+i-1);
        pq.push({info[h+i],{h+i,++ver[h+i]}});
        ans-=(y[i+1]-y[i])*(w-i-1);
    }
    //cerr<<ans<<"\n";
    //cerr<<"work\n";
    while(!pq.empty()){
        int x=pq.top().second.first;
        int tv=pq.top().second.second;
        pq.pop();
        if(x==1)continue;
        if(ver[x]!=tv)continue;
        //cerr<<x<<" "<<fp(pa[x])<<"\n";
        info[fp(pa[x])]=info[fp(pa[x])]+info[fp(x)];
        un(pa[x],x);
        ver[fp(pa[x])]++;
        pq.push({info[fp(pa[x])],{fp(pa[x]),ver[fp(pa[x])]}});
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...