# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
747839 | amirhoseinfar1385 | Triangles (CEOI18_tri) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include "trilib.h"
using namespace std;
bool cmp(int a,int b){
return is_clockwise(1,a,b);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n=get_n();
deque<int>top,bot;
for(int i=3;i<=n;i++){
if(is_clockwise(1,2,i)){
bot.push_back(i);
}
else{
top.push_back(i);
}
}
sort(top.begin(),top.end(),cmp);
sort(bot.begin(),bot.end(),cmp);
reverse(bot.begin(),bot.end());
deque<int>convb,convt;
for(int i=0;i<(int)top.size();i++){
if((int)convt.size()<=1){
convt.push_back(top[i]);
continue;
}
int f=0;
while((int)convt.size()>1){
if(is_clockwise(convt[(int)convt.size()-2],convt.back(),top[i])){
break;
}
else{
f=1;
convt.pop_back();
}
}
if(f){
convt.push_back(top[i]);
}
}
for(int i=0;i<(int)bot.size();i++){
if((int)convb.size()<=1){
convb.push_back(bot[i]);
continue;
}
int f=0;
while((int)convb.size()>1){
if(is_clockwise(convb[(int)convb.size()-2],convb.back(),bot[i])){
break;
}
else{
f=1;
convb.pop_back();
}
}
if(f){
convb.push_back(bot[i]);
}
}
while((int)convb.size()>1){
int u=convb.front();
int uu=convb[1];
if(is_clockwise(uu,u,1)!=is_clockwise(uu,u,2)){
convb.pop_front();
}
else{
break
}
}
while((int)convt.size()>1){
int u=convt.back();
int uu=convt[(int)convt.size()-2];
if(is_clockwise(uu,u,2)!=is_clockwise(uu,u,1)){
convt.pop_back();
}
else{
break;
}
}
convb.push_front(1);
convt.push_back(2);
if((int)convb.size()==1||(int)convt.size()==1){
int ret=(int)convb.size()+(int)convt.size();
give_answer(ret);
return 0;
}
/* cout<<top.size()<<" "<<bot.size()<<endl;
for(auto x:top){
cout<<x<<" ";
}
cout<<endl;
for(auto x:bot){
cout<<x<<" ";
}
cout<<endl;*/
int f=0;
for(int j=1;j<(int)convb.size();j++){
int u=convb[f];
int uu=convb[j];
if(is_clockwise(convt.front(),u,uu)!=is_clockwise(convt.front(),u,2)){
f=j;
}
}
for(int h=0;h<f;h++){
convb.pop_front();
}
if(f==0){
for(int j=1;j<(int)convt.size()-1;j++){
int u=convt[f];
int uu=convt[j];
if(is_clockwise(convb.front(),u,uu)!=is_clockwise(convb.front(),u,2)){
f=j;
}
}
for(int h=0;h<f;h++){
convt.pop_front();
}
}
int z=0;
f=(int)convt.size()-1;
for(int j=(int)convt.size()-2;j>=0;j--){
int u=convt[f];
int uu=convt[j];
if(is_clockwise(convb.back(),u,uu)!=is_clockwise(convb.back(),u,1)){
f=j;
z=1;
}
}
for(;(int)convt.size()>f+1;){
convt.pop_back();
}
if(z==0){
f=(int)convb.size()-1;
for(int j=(int)convb.size()-2;j>0;j--){
int u=convb[f];
int uu=convb[j];
if(is_clockwise(convt.back(),u,uu)!=is_clockwise(convt.back(),u,1)){
f=j;
}
}
for(;(int)convb.size()>f+1;){
convb.pop_back();
}
}
//cout<<convb.size()<<" "<<convt.size()<<endl;
int ret=(int)convb.size()+convt.size();
give_answer(ret);
return 0;
}