Submission #96936

#TimeUsernameProblemLanguageResultExecution timeMemory
96936kyn01286공룡 발자국 (KOI18_footprint)C++14
14 / 100
57 ms768 KiB
#include <iostream> #include <algorithm> #include <vector> using namespace std; int N, X, Y; vector< pair<int,int> > point; int sign(int a) { return a<0?-1:1; } bool cmp(pair<int,int> p1, pair<int,int> p2) { double d1 = ((double)X-p1.first)/(Y-p1.second); double d2 = ((double)X-p2.first)/(Y-p2.second); return d1 < d2; } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL); cin >> N; int y_min = 100000001, y_index; for(int i = 0; i < N; i++) { int a, b; cin >> a >> b; if(b < y_min) { y_min = b; y_index = i; } point.push_back(make_pair(a,b)); } X = point[y_index].first; Y = point[y_index].second; // 뒤꿈치 좌표 point.erase(point.begin()+y_index); sort(point.begin(), point.end(), cmp); pair<int, vector< pair<int,int> > > p[point.size()]; // 가능한 발가락 수 저장 int p_prev[point.size()]; // 전 발가락 인덱스 저장 for(int i = 0; i < point.size(); i++) { p[i].first = 0; p_prev[i] = -1; } /* for(int i = 0; i < point.size(); i++) { cout << point[i].first << ',' << point[i].second << '\n'; } */ for(int i = 0; i < point.size()-2; i++) { // 처음 점부터 for(int j = i+2; j < point.size(); j++) { // 마지막 점까지 확인해가면서 if(p[j].first < p[i].first + 1) { // p[j] >= p[i]+1이면 아래 계산 시간낭비임 for(int k = i+1; k <= j-1; k++) { // 안쪽으로 들어가는 '골'이 존재하는지 확인 //선분에서 O 점과 K점이 모두 선분으로 나누어지는 영역의 같은 영역에 속하는지 확인 long long temp_o = ((long long)point[j].second-point[i].second)*((long long)X-point[i].first) - ((long long)point[j].first-point[i].first)*((long long)Y-point[i].second); long long temp_k = ((long long)point[j].second-point[i].second)*((long long)point[k].first-point[i].first) - ((long long)point[j].first-point[i].first)*((long long)point[k].second-point[i].second); //if( (point[i].first<point[k].first)&&(grad_ij>grad_ik) || (point[i].first>point[k].first)&&(grad_ij<grad_ik) ) { // point[i], poin[j], point[k] 끼리 비교해야 하는데 어떻게 비교해야 할까?? if( (temp_o>0 && temp_k>0) || (temp_o<0 && temp_k<0) ) { // temp_k==0인건 직선 위에 있다는 뜻으로 틀린거. double grad_i = ((double)Y-point[i].second)/(X-point[i].first); double grad_j = ((double)Y-point[j].second)/(X-point[j].first); double grad_k = ((double)Y-point[k].second)/(X-point[k].first); if(grad_i!=grad_k && grad_j!=grad_k) { p[j].first = p[i].first + 1; p_prev[j] = i; p[j].second.clear(); // 기존 정보 지워주고 업데이트 p[j].second.push_back( point[i] ); p[j].second.push_back( point[k] ); break; } } } } } } int maxi = -1, maxi_i = 0; for(int i = 0; i < point.size(); i++) { if(maxi < p[i].first) { maxi = p[i].first; maxi_i = i; } } if(p[maxi_i].first == 0) { cout << 0; return 0; } else { cout << 2+(p[maxi_i].first*2) << '\n'; cout << X << ' ' << Y << '\n'; cout << point[maxi_i].first << ' ' << point[maxi_i].second << '\n'; int cur = maxi_i; while(cur != -1) { if(!p[cur].second.empty()) { cout << p[cur].second[1].first << ' ' << p[cur].second[1].second << '\n'; cout << p[cur].second[0].first << ' ' << p[cur].second[0].second << '\n'; } cur = p_prev[cur]; } } return 0; }

Compilation message (stderr)

footprint.cpp: In function 'int main()':
footprint.cpp:39:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < point.size(); i++) {
                 ~~^~~~~~~~~~~~~~
footprint.cpp:48:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < point.size()-2; i++) { // 처음 점부터 
                 ~~^~~~~~~~~~~~~~~~
footprint.cpp:49:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j = i+2; j < point.size(); j++) { // 마지막 점까지 확인해가면서 
                    ~~^~~~~~~~~~~~~~
footprint.cpp:75:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < point.size(); i++) {
                 ~~^~~~~~~~~~~~~~
footprint.cpp:34:19: warning: 'y_index' may be used uninitialized in this function [-Wmaybe-uninitialized]
  X = point[y_index].first; Y = point[y_index].second; // 뒤꿈치 좌표
                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...