对于这道题,不难得出,图形一定是轴对称图形,且横竖各有一条对称轴。
因此,我们可以将整个图形横着切一刀,竖着切一刀,求出任意一块的面积,再乘以 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;
}