Submission #1239498

#TimeUsernameProblemLanguageResultExecution timeMemory
1239498ByeWorldGarden (JOI23_garden)C++20
60 / 100
3092 ms39500 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#define int long long
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
typedef pair<int,int> pii;
typedef pair<pii,pii> ipii;
const int MAXN = 5e5+10;
const int MAXA = 5e5+10;
const int SQRT = 450;
const ll INF = 2e12;
const int MOD = 998244353;
const int LOG = 30;
int sum(int a, int b){ return (a+MOD+b)%MOD; }
void chsum(int &a, int b){ a = sum(a,b); }
int mul(int a, int b){ return a*b%MOD; }
void chmul(int &a, int b){ a = mul(a,b); }
void chmn(auto &a, auto b){ a = min(a, b); }
void chmx(auto &a, auto b){ a = max(a, b); }
vector<int> dx = {0, 0, 1, -1};
vector<int> dy = {1, -1, 0, 0};

int n, m, d;
int x[MAXN], y[MAXN], a[MAXN], b[MAXN];
vector<pii> ins, vec[MAXN];
int nx[MAXN], ba[MAXN], idx[MAXN];

int calc(int x, int y){
	if(x < y) return ins[y].fi-ins[x].fi;
	return ins[y].fi+d-ins[x].fi;
}
signed main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	// ofstream deb("pp.txt");
	cin>>n>>m>>d;
	for(int i=1; i<=n; i++){
		cin>>x[i]>>y[i];
	}
	for(int i=1; i<=m; i++){
		cin>>a[i]>>b[i];
	}

	int ans = d*d;
	for(int le=0; le<=d-1; le++){
		// ri dipindahin ke kanan
		int r = le;
		for(int i=1; i<=n; i++){
			if(x[i] < le) chmx(r, x[i]+d);
			else chmx(r, x[i]);
			ins.pb({y[i], i});
		}
		// cerr << le << ' '<< ri << " ini yg n doang\n";

		for(int i=1; i<=m; i++){
			if((le <= a[i] && a[i] <= r) || (le <= a[i]+d && a[i]+d <= r));
			else {
				ins.pb({b[i], i+n}); 
				if(a[i] < le) vec[a[i]+d].pb({b[i], i+n});
				else vec[a[i]].pb({b[i], i+n});
			}
		}

		if(ins.size() == 0) assert(false);

		int mx = 0;
		sort(ins.begin(), ins.end());
		for(int i=0; i<ins.size(); i++)
			idx[ins[i].se] = i;
		for(int i=0; i+1<ins.size(); i++){
			nx[i] = i+1;
			chmx(mx, calc(i, i+1) );
		}
		nx[ (int)ins.size()-1 ] = 0;
		chmx(mx, calc((int)ins.size()-1, 0) );
 
		for(int i=1; i<ins.size(); i++)
			ba[i] = i-1;
		ba[0] = (int)ins.size()-1;

		for(auto [x, y] : ins)
			assert(x < d);

		for(int ri=r; ri<=le+d-1; ri++){
			for(auto [y, i] : vec[ri]){ // pop dari id
				int id = idx[i];
				int BA = ba[id], NX = nx[id];
				nx[BA] = NX; ba[NX] = BA;

				if(0<=BA&&BA<ins.size() && 0<=NX&&NX<ins.size()) ;
				else assert(false);
				chmx(mx, calc(BA, NX) );
			}
			// cerr << le << ' '<< ri << ' ' << mx << " mx\n";
			if(mx > d) assert(false);
				
				chmn(ans, (d-mx+1) * (ri-le+1) );
		}
		// cerr << "Line: " << __LINE__ << '\n';

		for(int i=0; i<=d+d+5; i++) vec[i].clear();
		ins.clear();
	}

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