Submission #1092187

#TimeUsernameProblemLanguageResultExecution timeMemory
1092187onlk97Garden (JOI23_garden)C++14
100 / 100
2654 ms12552 KiB
#include <bits/stdc++.h>
using namespace std;
struct DSU{
    vector <int> pa,siz;
    void init(int n){
        for (int i=0; i<=n; i++){
            pa.push_back(i);
            siz.push_back(1);
        }
    }
    int prt(int n){
        if (pa[n]==n) return n;
        return pa[n]=prt(pa[n]);
    }
    void unn(int u,int v){
        u=prt(u); v=prt(v);
        if (u==v) return;
        if (siz[u]<siz[v]) swap(u,v);
        pa[v]=u;
        siz[u]+=siz[v];
    }
    int getsiz(int u){
        return siz[prt(u)];
    }
};
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n,m,d;
    cin>>n>>m>>d;
    int p[n+1],q[n+1],r[m+1],s[m+1];
    for (int i=1; i<=n; i++) cin>>p[i]>>q[i];
    for (int i=1; i<=m; i++) cin>>r[i]>>s[i];
    int cost[d];
    for (int i=0; i<d; i++) cost[i]=-1;
    for (int i=1; i<=n; i++) cost[q[i]]=1e9;
    for (int i=1; i<=m; i++) cost[s[i]]=max(cost[s[i]],r[i]+1);
    bool done[d];
    int ans=d*d;
    set <int> f;
    for (int i=1; i<=n; i++){
        f.insert(p[i]);
        f.insert(p[i]+d);
    }
    vector <int> ins[d];
    for (int i=1; i<=m; i++) ins[r[i]].push_back(s[i]);
    for (int i=0; i<d; i++){
        if (i){
            for (int j:ins[i-1]) cost[j]=max(cost[j],i+d);
        }
        vector <pair <int,int> > v;
        for (int j=0; j<d; j++) v.push_back({cost[j]-i,j});
        sort(v.begin(),v.end());
        int height=0;
        auto it=f.lower_bound(i+d);
        height=*(--it)-i+1;
        DSU dsu;
        dsu.init(d);
        for (int j=0; j<d; j++) done[j]=0;
        int gap=0;
        ans=min(ans,height*d);
        for (auto j:v){
            height=max(height,j.first);
            if (height>=d+10) break;
            int prv=(j.second+d-1)%d;
            if (done[prv]) dsu.unn(prv,j.second);
            int nxt=(j.second+1)%d;
            if (done[nxt]) dsu.unn(j.second,nxt);
            gap=max(gap,dsu.getsiz(j.second));
            done[j.second]=1;
            ans=min(ans,height*(d-gap));
        }
    }
    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...