做题记录 Luogu 2202

时间:2021-07-08
本文章向大家介绍做题记录 Luogu 2202,主要包括做题记录 Luogu 2202使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

P2202 [USACO13JAN]Square Overlap S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

对每个点的 x 排序,将 y 放进 set 查找前驱后继

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 100005
struct Poll
{
	ll x, y;
};
Poll a[N];
struct node
{
	ll val, num;
};
bool operator < (node a1, node a2)
{
	return a1.val < a2.val;
}
set<node> s;
bool cmp(Poll a1, Poll a2)
{
	if(a1.x != a2.x)
	{
		return a1.x < a2.x;
	}
	return a1.y < a2.y;
}
ll n, k;
int main()
{
	scanf("%lld%lld", &n, &k);
    for(ll i = 1; i <= n; i++)
    {
    	scanf("%lld%lld", &a[i].x, &a[i].y);
	}
	sort(a + 1, a + n + 1, cmp);
	ll l = 1, r = 1, ans = 0;
	while(r <= n)
	{
		while(l < r && a[r].x - a[l].x >= k)
		{
			s.erase((node){a[l].y, l});
			l++;
		}
		s.insert((node){a[r].y, r});
		set<node>::iterator it = s.find((node){a[r].y, r}), itt = it;
		if(it-- != s.begin() && a[r].y - it -> val < k)
		{
			if(!ans)
			{
				ans = (k - abs(a[r].x - a[it -> num].x)) * (k - abs(a[r].y - it -> val));
			}
			else
			{
				ans = -1;
			}
		}
		if(++itt != s.end() && itt -> val - a[r].y < k)
		{
			if(!ans)
			{
				ans = (k - abs(a[r].x - a[itt -> num].x)) * (k - abs(a[r].y - itt -> val));
			}
			else
			{
				ans = -1;
			}
		}
		r++;
	}
	printf("%lld", ans);
	return 0;
}

原文地址:https://www.cnblogs.com/fanypcd/p/14988706.html