ACM-ICPC 2018 徐州赛区网络预赛 G Trace

一道长相很水实际也很水但就是没有做出来的题

【题目链接】G Trace

【题目大意】

第一象限有一个海滩,海水从(0,0)处涌出。每一个海浪有参数x、y,表示冲刷掉矩形(0,0)-(x,y)内的痕迹并保留自己的痕迹。求n次冲刷后海岸上的痕迹总长。

【Input】

3
1 4
4 1
3 3

【Output】

10

【Hint】

 

【解题思路】

正着遍历有覆盖操作,很麻烦,我们倒着想。

每一次涨潮,痕迹从(x,y)向坐标轴延伸。那么我们只需要找x和y方向第一条拦住它的痕迹即可。丢到set里用lower_bound( ) 实现。

eg:(1,4)在x方向上被x=0挡住,在y方向上被y=3挡住。)

【代码】

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
using namespace std;
typedef long long ll;
const int maxn=10000000+5;
const int inf=0x3f3f3f3f;
const int MAXN = 3e5;
int a[maxn],b[maxn],n;
set<int> x,y;
int main()
{
    cin>>n;
    for (int i=n;i>0;i--) {
        scanf("%d%d",&a[i],&b[i]);
    }

    ll sum=0;
    x.insert(0);
    y.insert(0);
    for (int i=1;i<=n;i++) {
        set<int>::iterator it =x.lower_bound(a[i]);
        sum+=a[i]-*(--it);
        x.insert(a[i]);

        it=y.lower_bound(b[i]);
        sum+=b[i]-*(--it);
        y.insert(b[i]);
    }
    cout<<sum<<endl;

	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值