제출 #385785

#제출 시각아이디문제언어결과실행 시간메모리
385785mohamedsobhi777Triangles (CEOI18_tri)C++14
20 / 100
2 ms384 KiB
#include <bits/stdc++.h>
#include "trilib.h"
using namespace std;

#define vi vector<int>
#define vll vector<ll>
#define vii vector<pair<int, int>>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define loop(_) for (int __ = 0; __ < (_); ++__)
#define pb push_back
#define f first
#define s second
#define sz(_) ((int)_.size())
#define all(_) _.begin(), _.end()
#define lb lower_bound
#define ub upper_bound

using ll = long long;
using ld = long double;

const int N = 1e5 + 7;
const ll mod = 1e9 + 7;

int gn;
int ans; 

bool ok(int x, int y)
{
       int mask = 0;
       for (int i = 1; i <= gn; ++i)
       {
              if (x == i || y == i || mask == 3)
                     continue;
              mask |= 1 << is_clockwise(x, y, i);
       }
       return mask != 3;
}

// int solve(vi v)
// {
//        if (sz(v) == 0)
//               return 0;
//        if (sz(v) == 1)
//               return 2;
//        vi lhs, rhs;
//        random_shuffle(all(v));
//        int x = v[0], y = v[1];
//        for (int i = 2; i < sz(v); ++i)
//        {
//               int z = v[i];
//               (is_clockwise(x, y, z) ? lhs : rhs).pb(z);
//        }
//        return 2 + solve(lhs) + solve(rhs);
// }

int vis[N] ; 

void dfs(int x){
       vis[x] = 1 ; 

       for(int i =1 ;i <= gn ;++ i){
              if(vis[i])continue; 
              if(ok(x,i)){
                     ++ ans ; 
                     dfs(i) ; 
                     break;
              }
       }
}

int main()
{
       ios_base::sync_with_stdio(0);
       cin.tie(0);
#ifndef ONLINE_JUDGE
#endif
       gn = get_n();
       set<int> st;
       for (int i = 2; i <= gn; ++i)
       {
              st.insert(i);
       }

       while (sz(st) > 1)
       {
              vi v;
              for (auto u : st)
              {
                     v.pb(u);
              }
              random_shuffle(all(v));
              int t = v.back();
              vi lhs = {t}, rhs;
              for (auto u : v)
              {
                     if (u == t)
                            continue;
                     if (!is_clockwise(1, t, u))
                     {
                            lhs.pb(u);
                     }
              }
              st.clear();
              for (auto u : lhs)
                     st.insert(u) ; 
       }
       int root = *st.begin() ; 
       dfs(root) ; 
       cout << ++ans; 
       return 0;
}
#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...