欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-13 15:46:42
...

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

【题目链接】G Trace

【题目大意】

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

【Input】

3
1 4
4 1
3 3

【Output】

10

【Hint】

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

 

【解题思路】

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

每一次涨潮,痕迹从(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;
}

 

 

相关标签: set