CSP-S 2022模拟赛1 T1 题解

传送门

对于这道题,不难得出,图形一定是轴对称图形,且横竖各有一条对称轴。

因此,我们可以将整个图形横着切一刀,竖着切一刀,求出任意一块的面积,再乘以 4 4 4,就是正确答案。

例如样例 # 1 \#1 #1

我们只需要求这部分面积:

再乘以 4 4 4 即可。



下面来计算第分割后图形的面积。

可以得出,分割后的图形为阶梯状。宽度从上到下递增。

如果上面的宽度较大,下面的宽度较小,下面的就一定被覆盖,因此得出上面的结论。

我们保存如上图所有红点的坐标。

建立一个数组 a a a a y a_y ay 表示纵坐标为 y y y 的最大横坐标。

for(int i=1;i<=n;i++) 
{
	int x,y;
	cin>>x>>y;
	x/=2;y/=2;//坐标为(x/2,y/2)
	a[y]=max(a[y],x);//取最大值
}

接下来,从上向下枚举每一层。

维护一个变量 m a x n maxn maxn,表示当前遍历到的、最大的宽度。

假设当前枚举到第 i i i 层,这一层的宽度就是 max ⁡ ( m a x n , a [ i ] ) \max(maxn,a[i]) max(maxn,a[i])

上面的式子可以这样推导:

当前纵坐标为 i i i 的长方形覆盖了本层 a [ i ] a[i] a[i] 个方格。
上面的某个长方形覆盖了本层 m a x n maxn maxn 个方格。
取最大值,即为本层被覆盖的方格个数

int ans=0,maxn=0;
	
for(int i=10000000;i>=1;i--)//x,y<=10000000,所以从10000000开始枚举
{
	ans+=max(a[i],maxn);//求出本层被覆盖的方格数量
	maxn=max(a[i],maxn);//更新maxn
}

接下来输出 a n s × 4 ans \times 4 ans×4 即可



完整代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[10000010];
signed main()
{
	freopen("unija.in","r",stdin);
	freopen("unija.out","w",stdout);
	
	int n;cin>>n;
	for(int i=1;i<=n;i++) 
	{
		int x,y;
		cin>>x>>y;
		x/=2;y/=2;
		a[y]=max(a[y],x);
	}
	
	int ans=0,maxn=0;
	
	for(int i=10000000;i>=1;i--)
	{
		ans+=max(a[i],maxn);
		maxn=max(a[i],maxn);
	}
	cout<<ans*4;
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值