Submission #113699

#TimeUsernameProblemLanguageResultExecution timeMemory
113699RezwanArefin01Triangles (CEOI18_tri)C++17
100 / 100
29 ms2556 KiB
#include <bits/stdc++.h>
using namespace std;

#ifndef LOCAL
#include "trilib.h"
#else

const int N = 40010;

int _n;
long long x[N], y[N]; 

int get_n() {
    cin >> _n; 
    for(int i = 1; i <= _n; ++i) {
        cin >> x[i] >> y[i];
    }
    return _n;
}

int is_clockwise(int a, int b, int c) {
    assert(1 <= a && a <= _n && 1 <= b && b <= _n && 1 <= c && c <= _n && a != b && b != c && c != a); 
    return (x[b] - x[a]) * (y[c] - y[a]) - (y[b] -y[a]) * (x[c] - x[a]) < 0;
}

void give_answer(int s) {
    cout << s << endl; 
    exit(0);
}
#endif


vector<int> convex(vector<int> p) {
    sort(p.begin() + 1, p.end(), [](int i, int j) { 
        return !is_clockwise(1, i, j); 
    });
    vector<int> hull = { p[0] }; 
    for(int i = 1; i < p.size(); ++i) {
        int sz = hull.size(); 
        while(sz > 1 && is_clockwise(hull[sz - 2], hull[sz - 1], p[i])) 
            hull.pop_back(), --sz; 
        hull.push_back(p[i]); 
    }
    return hull;
}

vector<int> hull[2]; 

void fix_back() {
    hull[1].pop_back();
    while(1) {
        int sz = hull[0].size(), found = 0; 
        if(sz > 1 && is_clockwise(hull[0][sz - 2], hull[0].back(), hull[1].back())) {
            hull[0].pop_back(); 
            found = 1; 
        }
        sz = hull[1].size(); 
        if(sz > 1 && is_clockwise(hull[0].back(), hull[1].back(), hull[1][sz - 2])) {
            hull[1].pop_back(); 
            found = 1; 
        }
        if(!found) return; 
    }
}

int main(int argc, char const *argv[]) {
#ifdef LOCAL
    freopen("in", "r", stdin);
#endif
    int n = get_n(); 

    hull[0] = hull[1] = {1, 2}; 

    for(int i = 3; i <= n; ++i) {
        hull[!is_clockwise(1, 2, i)].push_back(i); 
    }

    hull[0] = convex(hull[0]); 
    hull[1] = convex(hull[1]); 

    hull[1].push_back(1);
    reverse(hull[1].begin(), hull[1].end()); 
    hull[1].pop_back();

    fix_back(); 
    reverse(hull[0].begin(), hull[0].end()); 
    reverse(hull[1].begin(), hull[1].end()); 
    swap(hull[0], hull[1]); 
    fix_back(); 

    give_answer(hull[0].size() + hull[1].size());
}

Compilation message (stderr)

tri.cpp: In function 'std::vector<int> convex(std::vector<int>)':
tri.cpp:38:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 1; i < p.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...