求调简单 Ad-hoc
查看原帖
求调简单 Ad-hoc
377873
EricWan楼主2025/1/12 11:20

目前对了一大半了

// Problem: P9514 [JOI Open 2023] 花园
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P9514
// Memory Limit: 1 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
//#include <bits/extc++.h>
#define int long long
#define min(x,y) (((x)<(y))?(x):(y))
#define max(x,y) (((x)>(y))?(x):(y))
#define lowbit(x) ((x)&-(x))
#define abs(x) (((x)<(0))?(-(x)):(x))
#define swap(a,b) a^=b^=a^=b
#define INF 1e18
#define MAXN 1000005
using namespace std;
int n, m, d, lstb[MAXN], cnt[MAXN], lflag[MAXN], alflag[MAXN], ans, lpointer[MAXN], rpointer[MAXN];
pair<int, int> a[MAXN], b[MAXN];
vector<int> by[MAXN];
unordered_set<int> blst[MAXN];
int getdis(int l, int r)
{
	// cout << "[getdis(" << l << "," << r << ")=";
	if (l <= r)
	{
		// cout << r - l + 1 << "]";
		return r - l + 1;
	}
	// cout << r + d - l + 1 << "]";
	return r + d - l + 1;
}
void printpointer()
{
	cout << "l: ";
	for (int i = 1; i <= d; i++)
	{
		cout << lpointer[i] << " ";
	}
	cout << endl;
	cout << "r: ";
	for (int i = 1; i <= d; i++)
	{
		cout << rpointer[i] << " ";
	}
	cout << endl;
}
signed main()
{
	cin >> n >> m >> d;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i].first >> a[i].second;
		if (a[i].first == 0)
		{
			a[i].first = d;
		}
		if (a[i].second == 0)
		{
			a[i].second = d;
		}
		cnt[a[i].first]++;
		lflag[a[i].second] = 1;
		alflag[a[i].second] = 1;
	}
	for (int i = 1; i <= m; i++)
	{
		cin >> b[i].first >> b[i].second;
		if (b[i].first == 0)
		{
			b[i].first = d;
		}
		if (b[i].second == 0)
		{
			b[i].second = d;
		}
		lflag[b[i].second] = 1;
		by[b[i].first].push_back(b[i].second);
	}
	sort(a + 1, a + n + 1);
	sort(b + 1, b + m + 1);
	for (int i = 1; i <= m; i++)
	{
		// if (!lst[b[i].second])
		// {
			// bfir[b[i].first].insert(b[i].second);
		// }
		// nxt[lst[b[i].second]] = i;
		// lst[b[i].second] = i;
		lstb[b[i].second] = b[i].first;
	}
	for (int i = 1; i <= d; i++)
	{
		if (lstb[i])
		{
			blst[lstb[i]].insert(i);
		}
	}
	// for (int i = 1; i <= d; i++)
	// {
		// for (int j : bfir[i])
		// {
			// nxt[lst[j]] = i;
		// }
	// }
	ans = d * d;
	// ans = a[1].second + d - a[n].second;
	// cout << ans << endl;
	// for (int i = 1; i < n; i++)
	// {
		// ans = max(ans, a[i + 1].second - a[i].second);
	// }
	// ans = d * (d - ans);
	// cout << ans << endl;
	// cout << "lflag: ";
	// for (int i = 1; i <= d; i++)
	// {
		// cout << lflag[i] << " ";
	// }
	// cout << endl;
	for (int i = 1; i <= d; i++)
	{
		// for (int j = 1; j <= d; j++)
		// {
			// cout << j << ": ";
			// for (int k : blst[j])
			// {
				// cout << k << " ";
			// }
			// cout << endl;
		// }
		int lst = 0;
		for (int j = 1; j <= d; j++)
		{
			if (lflag[j])
			{
				lst = j;
			}
		}
		int maxd = 0, CNT = 0;
		for (int j = 1; j <= d; j++)
		{
			if (lflag[j])
			{
				maxd = max(maxd, getdis(lst, j) - 2);
				if (getdis(lst, j) - 2 == -1)
				{
					maxd = max(maxd, d - 1);
				}
				rpointer[lst] = j;
				lpointer[j] = lst;
				lst = j;
			}
		}
		// cout << "   " << maxd << endl;
		// printpointer();
		for (int j = i, flag = 0; flag < d; flag++, j = j % d + 1)
		{
			// cout << "  " << i << " " << j << endl;
			for (int k : blst[j])
			{
				if (alflag[k])
				{
					continue;
				}
				// cout << j << " " << k << " " << lpointer[k] << " " << rpointer[k] << endl;
				maxd = max(maxd, getdis(lpointer[k], rpointer[k]) - 2);
				// if (getdis(lpointer[k], rpointer[k]) - 2 == -1)
				// {
					// maxd = max(maxd, d - 1);
				// }
				rpointer[lpointer[k]] = lpointer[k];
				lpointer[rpointer[k]] = rpointer[k];
				lpointer[k] = rpointer[k] = 0;
			}
			CNT += cnt[j];
			if (CNT == n)
			{
				// cout << i << " " << j << " " << maxd << ": ans = ";
				// printpointer();
				// cout << getdis(i, j) << " * " << (d - maxd) << " = " << getdis(i, j) * (d - maxd) << endl;
				ans = min(ans, getdis(i, j) * (d - maxd));
			}
		}
		for (int j : by[i])
		{
			blst[lstb[j]].erase(j);
			lstb[j] = i;
			blst[i].insert(j);
		}
	}
	cout << ans;
	return 0;
}
2025/1/12 11:20
加载中...