Submission #1157073

#TimeUsernameProblemLanguageResultExecution timeMemory
1157073_rain_Garden (JOI23_garden)C++20
100 / 100
2532 ms16316 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=(int)500000;
const int INF=(int)1e9;

class Disjoint_Set_Union{
	public:
		vector<int>par,sz;
		void init(int _n)
		{
			par.assign(_n+2,0) , sz.assign(_n+2,1);
			iota(par.begin(),par.end(),0);
		}
		int Find(int u){
			return par[u]==u?par[u]:par[u]=Find(par[u]);
		}
		void unite(int u,int v){
			u=Find(u),v=Find(v);
			if (u==v) return;
			if (sz[u]<sz[v]) swap(u,v);
			par[v]=u,sz[u]+=sz[v];
		}
		int getsz(int x){
			return sz[Find(x)];
		}
};

Disjoint_Set_Union dsu;

vector<int>f;
vector<int>need_change[N+2];
int n,m,d,gap;
int need_x[2][N+2],r[N+2];
bool del[N+2]={};

int Find(vector<int>&f,int x){
	return lower_bound(f.begin(),f.end(),x)-f.begin()-1;
}

void insert(int x,bool w){
	for(auto&k : {-1,1}){
		int nxt=(x+d+k)%d;
		if (del[nxt]) dsu.unite(x,nxt);
		gap=max(gap,(int)dsu.getsz(x));
	}
	del[x]=true;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	cin>>n>>m>>d;
	LL ans=(LL)1e18;
	for(int i=1;i<=n;++i) {
		int x,y; cin>>x>>y;
		f.push_back(x),f.push_back(x+d);
		r[y]=INF;
	}
	sort(f.begin(),f.end()); f.resize(unique(f.begin(),f.end())-f.begin());
	for(int i=1;i<=m;++i){
		int x,y; cin>>x>>y;
		r[y]=max(r[y],x);
		need_change[x].push_back(y);
	}
	for(int i=0;i<d;++i){
		if (i){
			for(auto&x:need_change[i-1]){
				r[x]=max(r[x],(i-1)+d);
			}
		}
		
		dsu.init(d);
		
		vector<pair<int,int>>v;
		for(int j=0;j<d;++j) v.push_back({r[j]-i+1,j});
		sort(v.begin(),v.end());
		
		int height=f[Find(f,i+d)]-i+1;
		assert(f[Find(f,i+d)]<=i+d);
		
		gap=0;
		ans=min(ans,(LL)height*d);
		for(int j=0;j<d;++j) del[j]=false;
		for(int j=0;j<d;++j){
			height=max(height,v[j].first);
			if (height>d) break;
			int x=v[j].second;
			insert(x,i==4);
			ans=min(ans,(LL)height*(d-gap));
		}
	}
	
	cout<<ans;
	
	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...