题目:平面奇景

题目描述

有一个特殊的平面世界,里面所有的物品都处在一个平面内。小胡正在探索这片平面奇景,他看到了一片连绵的山脉,这些山都是等腰直角三角形,所有三角形的斜边都作为山底落在一条直线上。

小胡在记录测量的数据时,想到只要记录下每座山的山顶的坐标( x_i,y_i ),就可以得到整座山的信息。

现在希望你根据小胡记录的这 n 座山的信息,求出被山覆盖的总面积。(这是一个平面世界,所以山与山重叠的部分只要记录一次

输入

第一行为一个整数 n,表示山的数量;

接下来会有 n 行,每行包含两个整数 x_i,y_i,表示第 i 座山山顶的坐标。

输出

输出所有山的可见面积,为保证结果为整数,所以输出面积乘以 4 的结果。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
struct Node{
    LL x,y;
    LL l,r;
}a[N];
LL n,s;
bool cmp(Node na, Node nb){
    return na.l<nb.l;
}
int main(){
  
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i].x >> a[i].y;
        a[i].l = a[i].x-a[i].y;
        a[i].r = a[i].x+a[i].y;
    } 
    sort(a+1,a+n+1,cmp);
    LL s = a[1].y*a[1].y*4;
    int last = 1;
    for(int i = 2; i <= n; i++){
        if(a[i].l >= a[last].r){
            s+=a[i].y*a[i].y*4;
            last=i;
        } else if(a[i].l < a[last].r && a[i].r > a[last].r){
            LL c = (a[last].r-a[i].l);
            s +=a[i].y*a[i].y*4-c*c;
            last=i;
        }
    }
    cout << s;
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值