ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[USACO20DEC] Rectangular Pasture S

2021-12-25 12:03:13  阅读:195  来源: 互联网

标签:USACO20DEC 头牛 int Rectangular lt 当前 Pasture 奶牛 边界


洛谷题面

不需 \(\operatorname{Discretization}\&\operatorname{BIT}\) 并且时间复杂度优秀的一篇题解!

本篇题解是对 这篇题解 的补充。

题目大意

网格图上有 \(N\) 头奶牛,第 \(i\) 头奶牛坐标为 \((x_i,y_i)\)。

现在用一个大小至少为 \(1\) 的矩形覆盖若干格子,问被覆盖的区域包含的奶牛集合有多少种情况,包含空集。(矩形恰好完整覆盖若干格子)

题目分析

我们没必要将边界放在空格上。

我们首先对所有坐标按照行从小到大排序。之后所有的牛都按照这个顺序来操作。

设 \(y[i]\) 表示第 \(i\) 头牛的列,\(l[j]\) 表示第 \(j\) 行的牛与当前第 \(i\) 行的牛之间,有多少头牛在第 \(j\) 行的牛的左边,\(r[j]\) 表示第 \(j\) 行的牛与当前第 \(i\) 行的牛之间,有多少头牛在当前第 \(i\) 行的牛的右边。

因为我们需要求出包含的奶牛集合有多少种情况 ,所以我们不妨讨论第 \(i\) 头奶牛作为下方边界,第 \(j\) 头奶牛作为上方边界。

这样子,我们就将题目简化了。接下来分情况讨论:

  1. 第 \(j\) 头牛在第 \(i\) 头牛的左边时:

    • 当第 \(k\) 行的牛在第 \(i\) 行的牛在第 \(j\) 头牛之间且在第 \(j\) 头牛左边,即 \(i\lt k\lt j,y[k]\lt y[j]\) 时:

    \(k\) 一定可以作为当前框定的左边界,当前情况的方案数为 \((rnum+1)\times(l[j]+1)\)。

    \(rnum\) 表示第 \(i\) 行的牛与当前第 \(j\) 行的牛之间,有多少头牛在第 \(i\) 行的牛右边。加 \(1\) 是因为可以选择边界。

    • 当第 \(k\) 行的牛在第 \(i\) 行的牛在第 \(j\) 头牛之间且在第 \(i\) 头牛右边,即 \(i\lt k\lt j,y[k]\gt y[i]\) 时:

    \(k\) 一定可以作为当前框定的右边界,当前情况的方案数为 \((lnum+1)\times(r[j]+1)\)。

    \(lnum\) 表示第 \(i\) 行的牛与当前第 \(j\) 行的牛之间,有多少头牛在第 \(j\) 行的牛左边。加 \(1\) 是因为可以选择边界。

  2. 第 \(j\) 头牛在第 \(i\) 头牛的右边时同理。


时间复杂度 \(\mathcal{O}(n^2)\)。

代码

#define int long long

const int ma=2505;

struct Node
{
	int x;
	
	int y;
};

Node node[ma];

int l[ma],r[ma];
//l[j]:排序后,第 j 行的牛与当前第 i 行的牛之间,有多少头牛在第 j 行的牛的左边
//r[j]:排序后,第 j 行的牛与当前第 i 行的牛之间,有多少头牛在当前第 i 行的牛的右边

int n;

inline bool cmp(Node x,Node y)
{
	if(x.x!=y.x)
	{
		return x.x<y.x;
	}
	
	return x.y<y.y;
}

#undef int

int main(void)
{
	#define int long long
	
	n=read();
	
	for(register int i=1;i<=n;i++)
	{
		node[i].x=read(),node[i].y=read();
	}
	
	sort(node+1,node+n+1,cmp);
	
	int ans=1;
	 
	for(register int i=1;i<=n;i++)
	{
		ans++;
		
		int lnum=0,rnum=0;
		
		for(register int j=i-1;j>=1;j--)
		{
			if(node[i].y>node[j].y)
			{
				ans+=(rnum+1)*(l[j]+1);
				
				lnum++,r[j]++; 
			}
			
			else
			{
				ans+=(lnum+1)*(r[j]+1);
				
				rnum++,l[j]++;
			}
		}
	}
	
	printf("%lld\n",ans);
	
	return 0;
}

标签:USACO20DEC,头牛,int,Rectangular,lt,当前,Pasture,奶牛,边界
来源: https://www.cnblogs.com/Coros-Trusds/p/15730144.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有