zoukankan      html  css  js  c++  java
  • 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_jxixj and y_i le y_jyiyj 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;
    }
    

      

  • 相关阅读:
    StarUML3.x的破解方法
    图解git基本使用
    Elasticsearch分页查询From&Size vs scroll vs search_after
    MySQL索引及使用详解
    mysql中key 、primary key 、unique key 与index区别
    MySQL避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)
    git config配置快捷命令
    linux基础命令使用详解
    MySQL索引详解——full-text,b-tree,hash,r-tree
    Insert Interval 面试题leetcode.
  • 原文地址:https://www.cnblogs.com/l609929321/p/9614868.html
Copyright © 2011-2022 走看看