牛客多校第九场J-Symmetrical Painting

题目连接 J-Symmetrical Painting
题意:
有一个平面,上面有n个黑的的矩形,对于第i个矩形:输入l,r,代表该矩形的左下角和右上角坐标是(i-1,l),(i,r),现在可以把其中某些区域涂成白色,使得剩余的黑色部分有一条关于x轴平行的对称轴。
红色的部分即为对称的最大面积,蓝色部分是要涂成白色的部分
红色的部分即为对称的最大面积,蓝色部分是要涂成白色的部分。
思路:
需要处理每个矩形的三个关键点:分别是y = l,y = (l+r)/2,y = r地方。
当对称轴在一个矩形的y = l处时,y每当y上升k时,对称的面积就会增加2k,直到y = (l+r)/2的时候,所以我们设在这段过程中,该矩形的贡献度为1;当对称轴处于y = (l+r)/2的时候,这时对称面积最大,y每上升k时,对称的面积会减少2k,直到y = r时,所以我们设在这段过程中,该矩形的贡献度为1-2 = -1,当y = r时,此时和之后该矩形的对称面积都为0,所以在这之后的过程中,该矩形的贡献度为-1+1=0。
所以我们要算出在每个矩形三个关键处所以矩形的贡献度,在乘上长度(宽不需要管,所有矩形的宽度都为1),即为最终的对称面积.(要对所有的关键y进行排序,这样可以每次只算从上一个y到这个y的变化值,不用纪录每个矩形的所贡献的面积)。
代码:

#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long ll;

struct node
{
    ll y,k;
};
node a[1000005];

bool cmp(node a,node b)
{
    return a.y < b.y;
}

int main()
{
    int n;
    scanf("%d",&n);
    ll l,r;
    int cnt=0;
    for(int i  = 0 ;i < n;i++){
        scanf("%lld%lld",&l,&r);
        l*=2,r*=2;//因为中点坐标可能出现小数,所有先给所有的坐标乘2,算单边的面积,最后不用再乘2
        a[cnt].y = l,a[cnt++].k = 1;
        a[cnt].y = (l+r)>>1,a[cnt++].k = -2;
        a[cnt].y = r,a[cnt++].k = 1;
    }
    sort(a,a+cnt,cmp);
    ll ans = 0,sum = 0,pre = 0,kk=0;
    for(int i = 0;i < cnt;i++){
        sum+=kk*(a[i].y - pre);
        pre = a[i].y;
		kk += a[i].k;
        ans = max(ans,sum);
    }
    printf("%lld\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值