Submission #259802

#TimeUsernameProblemLanguageResultExecution timeMemory
259802MKopchevTriangles (CEOI18_tri)C++14
100 / 100
41 ms2176 KiB
#include "trilib.h"
#include<bits/stdc++.h>
using namespace std;

int n;
/*
int get_n()
{
    cin>>n;
    return n;
}
bool is_clockwise(int i,int j,int k)
{
    cout<<i<<" "<<j<<" "<<k<<" -> ";
    int ret;
    cin>>ret;
    return ret;
}
void give_answer(int sz)
{
    cout<<sz<<endl;
}
*/
set<int> hull;

vector<int> points[2];

bool cmp(int a,int b)
{
    return is_clockwise(a,1,b);
}

stack<int> hulls[2];

bool pop_wrong()
{
    int was=points[0].size()+points[1].size();
    /*
    for(auto k:points[0])cout<<k<<" ";cout<<endl;
    for(auto k:points[1])cout<<k<<" ";cout<<endl;
    */
    while(points[0].size()>=2&&is_clockwise(points[1][0],points[0][points[0].size()-1],points[0][points[0].size()-2])==1)points[0].pop_back();
    /*
    for(auto k:points[0])cout<<k<<" ";cout<<endl;
    for(auto k:points[1])cout<<k<<" ";cout<<endl;
    */
    while(points[1].size()>=2&&is_clockwise(points[0][0],points[1][points[1].size()-1],points[1][points[1].size()-2])==1)points[1].pop_back();

    reverse(points[0].begin(),points[0].end());
    reverse(points[1].begin(),points[1].end());

    while(points[0].size()>=2&&is_clockwise(points[1][0],points[0][points[0].size()-1],points[0][points[0].size()-2])==0)points[0].pop_back();

    while(points[1].size()>=2&&is_clockwise(points[0][0],points[1][points[1].size()-1],points[1][points[1].size()-2])==0)points[1].pop_back();

    reverse(points[0].begin(),points[0].end());
    reverse(points[1].begin(),points[1].end());

    int is=points[0].size()+points[1].size();

    return was>is;
}

int main()
{
	n=get_n();

	for(int i=3;i<=n;i++)
        points[is_clockwise(1,2,i)].push_back(i);

    //cout<<"---"<<endl;

    sort(points[0].begin(),points[0].end(),cmp);

    //cout<<"---"<<endl;

    sort(points[1].begin(),points[1].end(),cmp);
    /*
    cout<<"0: ";for(auto k:points[0])cout<<k<<" ";cout<<endl;
    cout<<"1: ";for(auto k:points[1])cout<<k<<" ";cout<<endl;
    */
    hulls[0].push(2);
    for(auto k:points[0])
        {
            while(hulls[0].size()>=2)
            {
                int tp=hulls[0].top();
                hulls[0].pop();

                int prv=hulls[0].top();

                if(is_clockwise(prv,tp,k)==0)
                {
                    hulls[0].push(tp);
                    break;
                }
            }

            hulls[0].push(k);
        }

    hulls[1].push(1);

    for(auto k:points[1])
        {
            while(hulls[1].size()>=2)
            {
                int tp=hulls[1].top();
                hulls[1].pop();

                int prv=hulls[1].top();

                if(is_clockwise(prv,tp,k)==0)
                {
                    hulls[1].push(tp);
                    break;
                }
            }

            hulls[1].push(k);
        }

    for(int w=0;w<2;w++)
    {
        points[w]={};

        while(hulls[w].size())
        {
            points[w].push_back(hulls[w].top());
            hulls[w].pop();
        }
    }

    while(pop_wrong());

    give_answer(points[0].size()+points[1].size());
    /*
    for(auto k:points[0])cout<<k<<" ";cout<<endl;
    for(auto k:points[1])cout<<k<<" ";cout<<endl;
    */
	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...