Submission #1039930

#TimeUsernameProblemLanguageResultExecution timeMemory
10399300npataTriangles (CEOI18_tri)C++17
100 / 100
17 ms4284 KiB
#include<bits/stdc++.h>
#include "trilib.h"

using namespace std;

#define vec vector
#define int long long

int n;

bool on_the_right(int i, int j, int k) {
    if(i==j || j == k || i == k) return false;
    return is_clockwise(i+1, j+1, k+1);
}

bool is_on_convex_hull(int i) {
    int mx = i == 0 ? 1 : 0;

    for(int j = 0; j<n; j++) {
        if(j == i || j == mx) continue;
        if(on_the_right(i, mx, j)) mx = j;
    }

    for(int j = 0; j<n; j++) {
        if(j == i || j == mx) continue;
        if(on_the_right(i, mx, j)) return false;
    }

    return true;
}

vec<int> convex_hull_from_point(int p, vec<int> all_points) {
    sort(all_points.begin(), all_points.end(), [&](int i, int j) { return on_the_right(p, j, i); });
    vec<int> stk{p};
    all_points.push_back(p);
    for(int p_nxt : all_points) {
        while(stk.size() > 1 && on_the_right(stk[stk.size()-2], stk[stk.size()-1], p_nxt)) {
            stk.pop_back();
        }
        stk.push_back(p_nxt);
    }
    stk.pop_back();
    return stk;
}

int32_t main() {
    n = get_n();
    
    int p1 = 0;
    int p2 = 1;
    vec<int> ps_r{};
    vec<int> ps_l{};
    for(int i = 2; i<n; i++) {
        if(on_the_right(p1, p2, i)) ps_r.push_back(i);
        else ps_l.push_back(i);
    }

    vec<int> ch_l = convex_hull_from_point(p1, ps_l);
    vec<int> ch_r = convex_hull_from_point(p2, ps_r);


    int l_i = 0;
    int r_i = 0;

    vec<int> chnxt(n, -1);
    for(int i = 0; i<ch_l.size(); i++) {
        chnxt[ch_l[i]] = ch_l[(i+1)%ch_l.size()];
    }
    for(int i = 0; i<ch_r.size(); i++) {
        chnxt[ch_r[i]] = ch_r[(i+1)%ch_r.size()];
    }


    while(1) {
           int l_i_nxt = (l_i+1)%ch_l.size();
           int r_i_nxt = (r_i-1+ch_r.size())%ch_r.size();
           if(on_the_right(ch_r[r_i], ch_l[l_i], ch_l[l_i_nxt])) {
               l_i = l_i_nxt;
               continue;
           }
           if(on_the_right(ch_r[r_i], ch_l[l_i], ch_r[r_i_nxt])) {
               r_i = r_i_nxt;
               continue;
           }
           chnxt[ch_r[r_i]] = ch_l[l_i];
           break;
    }
    l_i = 0;
    r_i = 0;

    while(1) {
           int l_i_nxt = (l_i-1+ch_l.size())%ch_l.size();
           int r_i_nxt = (r_i+1)%ch_r.size();
           if(on_the_right(ch_l[l_i], ch_r[r_i], ch_l[l_i_nxt])) {
               l_i = l_i_nxt;
               continue;
           }
           if(on_the_right(ch_l[l_i], ch_r[r_i], ch_r[r_i_nxt])) {
               r_i = r_i_nxt;
               continue;
           }
           chnxt[ch_l[l_i]] = ch_r[r_i];
           break;
    }
    
    
    vec<int> ch{ch_l[0]};
    for(int i = 0; i<n*2; i++) {
        ch.push_back(chnxt[ch.back()]);
    }
    reverse(ch.begin(), ch.end());
    vec<bool> used(n);
    int ans = 0;
    for(int p : ch) {
        if(used[p]) break;
        used[p] = true;
        ans++;
    }

    give_answer(ans);

    return 0;
}

Compilation message (stderr)

tri.cpp: In function 'int32_t main()':
tri.cpp:66:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |     for(int i = 0; i<ch_l.size(); i++) {
      |                    ~^~~~~~~~~~~~
tri.cpp:69:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |     for(int i = 0; i<ch_r.size(); i++) {
      |                    ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...