Submission #1136982

#TimeUsernameProblemLanguageResultExecution timeMemory
1136982monaxiaPlanine (COCI21_planine)C++20
30 / 110
44 ms10972 KiB
#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define fr first
#define sc second
#define all(v) v.begin(), v.end()
#define mod (long long)(1e9 + 7)
#define eps (long long)(1e-9)
#define vektor vector
using namespace std;
 
using ll = long long;
using ull = unsigned long long;
using ld = long double;
 
const ull Mod = 1e9 + 7;
const ll LIMIT = 2e5;

struct line{
    ld a, b;
};

struct point{
    ld x, y;
};

ld slope(line a, line b){
    ld top = b.b - a.b, bottom = a.a - b.a;
    return top / bottom;
}

line inter(line A, line B){
    ld x = A.a, y = A.b, u = B.a, v = B.b;
    ld a = (y - v) / (x - u);
    ld b = y - a * x;

    line l;
    l.a = a, l.b = b;

    return l;
}

line make_line(int x, int y){
    line a;
    a.a = x, a.b = y;
    return a;
}

void find_left(int n, int k, vector <line>& a, vector <ld>& lim){
    vector <line> points;
    vector <ld> slopes;

    points.pb(a[1]);

    for(int i = 2; i <= n; i ++){
        while(!slopes.empty() && slopes.back() > slope(a[i], points.back())){
            slopes.ppb();
            points.ppb();
        }

        if(i & 1 && i < n){
            lim[i] = slope(inter(points.back(), a[i]), make_line(0, k));
        } 

        slopes.pb(slope(points.back(), a[i]));
        points.pb(a[i]);
    }
}

void find_right(int n, int k, vector <line>& a, vector <ld>& lim){
    vector <line> points;
    vector <ld> slopes;

    points.pb(a[n]);

    for(int i = n - 1; i > 1; i --){
        while(!slopes.empty() && slopes.back() < slope(a[i], points.back())){
            slopes.ppb();
            points.ppb();
        }

        if(i & 1 && i < n){
            lim[i] = slope(inter(points.back(), a[i]), make_line(0, k));
        } 

        slopes.pb(slope(points.back(), a[i]));
        points.pb(a[i]);
    }
}

void solve(){
    int n, k;
    cin >> n >> k;

    vector <line> a(n + 1);

    for(int i = 1; i <= n; i ++){
        cin >> a[i].a >> a[i].b;
    }

    vector <ld> left(n + 1), right(n + 1);

    find_left(n, k, a, left);
    find_right(n, k, a, right);

    vector <ld> cpr;

    for(int i = 3; i < n; i += 2){
        cpr.pb(left[i]);
        cpr.pb(right[i]);
    } 

    sort(all(cpr));

    cpr.resize(unique(all(cpr)) - cpr.begin());

    for(int i = 3; i < n; i += 2){
        left[i] = lower_bound(all(cpr), left[i]) - cpr.begin() + 1;
        right[i] = lower_bound(all(cpr), right[i]) - cpr.begin() + 1;

        // cout << left[i] << " " << right[i] << "\n";
    }

    vector <pair <int, int>> seg;

    for(int i = 1; i <= n; i ++) {
        seg.pb(make_pair(left[i], right[i]));
    }

    sort(all(seg), [](pair <int, int>& a, pair <int, int>& b){
        if(a.sc != b.sc) return a.sc < b.sc;
        return a.fr < b.fr;
    });

    int r = 0, ans = 0;

    for(auto x : seg){
        if(r < x.fr){
            r = x.sc;
            ans ++;
        }
    }

    cout << ans;
}

 
signed main()
{
    cin.tie(0)->sync_with_stdio(0);
 
    // if(fopen("nameholder.inp", "r")){
    //     freopen("nameholder.inp", "r", stdin);
    //     freopen("nameholder.out", "w", stdout);
    // }
    
    // cout << 1; return 0;
 
    ll n = 1;
 
    // cin >> n;
 
    while(n) {
        solve();
        n --;
        cout << "\n";
    }
 
    // cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
    return 0;
}
 
//                                   ++++                                           
//                          ++++-::......:--:::-=+++                                
//                    ++++=:............---.....--:..:=++++++                       
//                    +++++++::......................::=+++++                       
//             @@               ++++++++++:+++++++++                                
//             @%                                  @*                               
//              %%@@                    *****#*@@                                   
//             %%%%%                  @##**##***%                                   
//           @@@@@@+-*#*@             #####%+*##*@                                  
//                  %#+@%%@@@         ##-%:::-#*###@@                               
//                 =====:*:::        ###-:==::=#*%*                                 
//                    -====:::::+@@%@@%@#*--=*#%%#@%@   @%@                         
//                        @=====%=-@%=:::.:+-::::+::::::::::::%-----%% @@@@@        
//                        @@%#*@++%===+::-================@%@@@@+++++++@@@%%%@#%###%
//               @#***#@@   @##=%@===+--:+==+===+%*##@%%%@@@@@@@@@@:=  @%@%%%@#%%   
//    -@      @*#@         #####%:::-====+:::==---**%#@ *%%%%@@@@@@-:               
//    -=-*%  #          #***--%%::::::::+=-+#-----=**@*#     #+**#@#                
//     ----=----#+****=----=*#@=::::::=#-----------***%*%                           
//      ------------%*****##=@==::::::+%-----------***%**                           
//       +-----------------*@++%::::::::-----------****@*#                          
//         =------------% @%=+%#+:::::::* #-----*--**** **                          
//            ----%--%    *==+++++=+=##*:%   ---=--**** **                          
//                       %@@@@@@@@@==@+%%%%@   ----**** *#                          
//                     @=*+%@@@%@@=++=:%:::%      #***@@#                           
//                    #+++++++++#==++-::::::     @**** *#                           
//                   =+++++++++++==+++:::::::   ####@ #%                            
//                  +++++++++++=@ @++++::::::@      @#                              
//                 @+++++++++=@    =*++=:::::@                                      
//                 ++++++++@       @++++:::::                                       
//                ++++++=           =++++:::                                        
//               =+++++@             =+++::::                                       
//             ++++++-@               =+++:+::                                      
//           @::+::::@                 =++::-:::                                    
//          +::=:::::                  @+*+:-+++-:                                  
//        @::+-:::::#                     +++::::::@                                
//       ::%=:::::::%@                    @%++::::***                               
//     @:+@*:::::::****@                   +@+++:-=*:*@                             
//    *:@@%::::::::=****                   @%@+++:::#**@                            
//   *%@@@-:::::::%=+==*@                   +@%+++:***+*                            
//  #%@@%%::::::::#+=-=#                    =+@+++++:::*+                           
// @####+::::::::%+=@#%#=@                  @**@@%=++::::@                          
// @   +:::::::::***#*@ @@###+=+=%@          +**#+=+*+:::-                          
//    =-:::::::%%%%@@          @#=*########%#+*%%+--@*+::%                          
//   +---%@                                   @@ =-:-**:#                           
//  %%%%%                                        @+--*@                             
// @%%%%@                                        @%%%%%                             
//                                                @%%@@
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...