Submission #650740

#TimeUsernameProblemLanguageResultExecution timeMemory
650740fatemetmhrTriangles (CEOI18_tri)C++17
75 / 100
3058 ms2396 KiB
//  ~Be name khoda~  //

#include<bits/stdc++.h>
#include "trilib.h"

using namespace std;

typedef long long ll;

#define pb       push_back
#define mp       make_pair
#define all(x)   x.begin(), x.end()
#define fi       first
#define se       second
#define cl       clear
#define endll    '\n'

const int maxn  =  1e6   + 10;
const int maxn5 =  5e5   + 10;
const int maxnt =  1.2e6 + 10;
const int maxn3 =  1e3   + 10;
const int mod   =  1e9   +  7;
const ll  inf   =  2e18;

int nxt[maxn5], pre[maxn5], av[maxn5];

int main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int n = get_n();
    nxt[1] = 2; nxt[2] = 3; nxt[3] = 1;
    pre[1] = 3; pre[2] = 1; pre[3] = 2;
    if(n == 3){
        give_answer(3);
        return 0;
    }
    int st = 1;
    for(int i = 4; i <= n; i++){
        int out = -1;
        bool hullorder = is_clockwise(st, nxt[st], nxt[nxt[st]]);
        bool ans = is_clockwise(st, nxt[st], i);
        ans ^= hullorder;
        if(ans){
            out = st;
        }
        else{
            int have = nxt[st];
            int hi = 0;
            for(int i = 0; have != st; i++, have = nxt[have]){
                av[i] = have;
                hi = i;
            }
            int sz = hi;
            int lo = 0;
            while(hi - lo > 1){
                int mid = (lo + hi) >> 1;
                if(hullorder ^ is_clockwise(st, av[mid], i))
                    hi = mid;
                else
                    lo = mid;
            }
            //cout << "here " << st << ' ' << sz << ' ' << lo << ' ' << hi << endl;
            if(hi == sz && is_clockwise(st, pre[st], nxt[st]) != is_clockwise(st, pre[st], i)){
                lo = hi;
                //cout << "oh spc case " << endl;
                if(is_clockwise(av[lo], st, nxt[st]) != is_clockwise(av[lo], st, i))
                    out = av[lo];
            }
            else{
                if(is_clockwise(av[lo], av[lo + 1], nxt[av[lo + 1]]) != is_clockwise(av[lo], av[lo + 1], i))
                    out = av[lo];
            }
        }
        if(out == -1)
            continue;
        //cout << "it's " << out << endl;
        for(out = nxt[out]; ; out = nxt[out])
            if(is_clockwise(out, nxt[out], nxt[nxt[out]]) == is_clockwise(out, nxt[out], i))
                break;
        int r = out;
        //cout << "hola " << r << endl;
        for(out = pre[out]; ; out = pre[out])
            if(is_clockwise(out, pre[out], pre[pre[out]]) == is_clockwise(out, pre[out], i))
                break;
        int l = out;
        //cout << "wow it's " << l << endl;
        nxt[l] = i;
        pre[r] = i;
        nxt[i] = r;
        pre[i] = l;
        st = i;
        /*
        cout << "let's check " << i << endl;
        int j = st;
        cout << j << ' ';
        j = nxt[j];
        while(j != st){
            cout << j << ' ';
            j = nxt[j];
        }
        cout << endl;
        //*/
    }
    int num = 1;
    for(int i = nxt[st]; i != st; i = nxt[i]) num++;
    give_answer(num);
}
#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...