Trace 2018徐州icpc网络赛 思维+二分

Posted l609929321

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Trace 2018徐州icpc网络赛 思维+二分相关的知识,希望对你有一定的参考价值。

There‘s a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy) means the wave is a rectangle whose vertexes are ( 00 , 00 ), ( xx , 00 ), ( 00 , yy ), ( xx , yy ). Every time the wave will wash out the trace of former wave in its range and remain its own trace of ( xx , 00 ) -> ( xx , yy ) and ( 00 , yy ) -> ( xx , yy ). Now the toad on the coast wants to know the total length of trace on the coast after n waves. It‘s guaranteed that a wave will not cover the other completely.

Input

The first line is the number of waves n(n le 50000)n(n50000).

The next nn lines,each contains two numbers xxyy ,( 0 < x0<x , y le 10000000y10000000 ),the ii-th line means the ii-th second there comes a wave of ( xx , yy ), it‘s guaranteed that when 1 le i1i , j le njn,x_i le x_jxi?xj? and y_i le y_jyi?yj? don‘t set up at the same time.

Output

An Integer stands for the answer.

Hint:

As for the sample input, the answer is 3+3+1+1+1+1=103+3+1+1+1+1=10

技术分享图片

样例输入

3
1 4
4 1
3 3

样例输出

10

题目来源

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

 

题意:有n次海浪,每次海浪会产生两段轨迹(0,y)到(x,y)和(x,0)到(x,y),后面的海浪会将前面的在(0,0)到(x,y)之间区域的海浪轨迹覆盖掉,问最后剩余的轨迹长度

分析:每段轨迹有效的贡献是在此轨迹被接下来所有轨迹覆盖一次后剩余的轨迹长度

  所以我们考虑直接从后面往前面枚举

  最后的轨迹长度肯定是可以直接加上的,没有其余的海浪能覆盖掉他,然后将其的轨迹点放进集合

  接下来遍历到的点看集合只要看集合里比他小的最大的数就是能覆盖掉他多少长度,减去这个长度就行

AC代码:

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define ls (r<<1)
#define rs (r<<1|1)
#define debug(a) cout << #a << " " << a << endl
using namespace std;
typedef long long ll;
const ll maxn = 1e5+10;
const ll mod = 2e9+7;
const double pi = acos(-1.0);
const double eps = 1e-8;
ll f( vector<ll> e ) {
    ll sz = e.size(), ans = 0;
    set<ll> s;
    for( ll i = sz-1; i >= 0; i -- ) {
        set<ll>::iterator it = s.lower_bound(e[i]);
        if( it == s.begin() ) {
            ans += e[i];
        } else {
            it --;
            ans += e[i] - *it;
        }
        s.insert(e[i]);
    }
    return ans;
}
int main() {
    ll x, y, n;
    vector<ll> e1, e2;
    scanf("%lld",&n);
    while( n -- ) {
        scanf("%lld%lld",&x,&y);
        e1.push_back(x), e2.push_back(y);
    }
    printf("%lld
",f(e1)+f(e2));
    return 0;
}

  

以上是关于Trace 2018徐州icpc网络赛 思维+二分的主要内容,如果未能解决你的问题,请参考以下文章

2018 ICPC 徐州网络赛 D. Easy Math(思维,反演,杜教筛)

2018 ICPC 徐州网络赛

ICPC 2018 徐州赛区网络赛

ACM-ICPC 2018 徐州赛区(网络赛)

2018ICPC徐州区域赛网络赛G(vector+set模拟)

ICPC2018徐州网络赛 Hard to prepare(dp)