이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "trilib.h"
using namespace std;
const int MN = 4e4+5;
vector<int> U,D;
int stD[MN],stU[MN],cntD,cntU,s,e,ans;
bool isend;
bool cmp1(int a, int b)
{
return is_clockwise(1,a,b);
}
bool cmp2(int a, int b)
{
return is_clockwise(2,a,b);
}
int main()
{
int N = get_n();
for(int i=3; i<=N; i++){
if(is_clockwise(1,2,i)) D.push_back(i);
else U.push_back(i);
}
sort(D.begin(),D.end(),cmp1);
sort(U.begin(),U.end(),cmp2);
stD[0] = 1;
stD[1] = 2;
cntD = 1;
for(int x : D){
while(cntD && !is_clockwise(stD[cntD-1],stD[cntD],x)) cntD--;
stD[++cntD] = x;
}
//if(D.size()) while(!is_clockwise(stD[cntD-1],stD[cntD],1)) cntD--;
stU[0] = 2;
stU[1] = 1;
cntU = 1;
for(int x : U){
while(cntU && !is_clockwise(stU[cntU-1],stU[cntU],x)) cntU--;
stU[++cntU] = x;
}
//if(U.size()) while(!is_clockwise(stU[cntU-1],stU[cntU],2)) cntU--;
ans = cntD+cntU;
if(!D.size() || !U.size()){
give_answer(ans);
return 0;
}
if(!is_clockwise(stD[cntD],stU[1],stU[2])){
s = cntD, e = 2;
isend = false;
while(!isend){
isend = true;
if(s && !is_clockwise(stD[s-1],stD[s],stU[e])){
s--;
isend = false;
}
if(e<cntU && !is_clockwise(stD[s],stU[e],stU[e+1])){
e++;
isend = false;
}
}
ans -= (cntD-s) + (e-1);
}
if(!is_clockwise(stU[cntU],stD[1],stD[2])){
s = cntU, e = 2;
isend = false;
while(!isend){
isend = true;
if(s && !is_clockwise(stU[s-1],stU[s],stD[e])){
s--;
isend = false;
}
if(e<cntD && !is_clockwise(stU[s],stD[e],stD[e+1])){
e++;
isend = false;
}
}
ans -= (cntU-s) + (e-1);
}
give_answer(ans);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |