제출 #599914

#제출 시각아이디문제언어결과실행 시간메모리
599914Hanksburger자리 배치 (IOI18_seats)C++17
37 / 100
4053 ms117924 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; vector<int> x, y, xmn, ymn, xmx, ymx; set<int> xs[1005], ys[1005]; int n, m, sum; void give_initial_chart(int N, int M, vector<int> X, vector<int> Y) { n=N; m=M; x=X; y=Y; if (n<=1000 && m<=1000) { for (int i=0; i<n*m; i++) { xs[x[i]].insert(i); ys[y[i]].insert(i); } } else { for (int i=0; i<n*m; i++) { if (!i) { xmn.push_back(x[i]); ymn.push_back(y[i]); xmx.push_back(x[i]); ymx.push_back(y[i]); } else { xmn.push_back(min(xmn[i-1], x[i])); ymn.push_back(min(ymn[i-1], y[i])); xmx.push_back(max(xmx[i-1], x[i])); ymx.push_back(max(ymx[i-1], y[i])); } sum+=((xmx[i]-xmn[i]+1)*(ymx[i]-ymn[i]+1)==i+1); } } } int swap_seats(int a, int b) { if (a>b) swap(a, b); if (n<=1000 && m<=1000) { xs[x[a]].erase(a); ys[y[a]].erase(a); xs[x[b]].erase(b); ys[y[b]].erase(b); swap(x[a], x[b]); swap(y[a], y[b]); xs[x[a]].insert(a); ys[y[a]].insert(a); xs[x[b]].insert(b); ys[y[b]].insert(b); vector<pair<int, pair<int, int> > > v; for (int i=0; i<n; i++) v.push_back({*xs[i].begin(), {0, i}}); for (int i=0; i<m; i++) v.push_back({*ys[i].begin(), {1, i}}); sort(v.begin(), v.end()); int Xmn=1e9, Xmx=-1, Ymn=1e9, Ymx=-1, ans=1; for (int i=0; i<v.size(); i++) { if (v[i].first==v[i+1].first) { Xmn=min(Xmn, v[i].second.second); Xmx=max(Xmx, v[i].second.second); i++; Ymn=min(Ymn, v[i].second.second); Ymx=max(Ymx, v[i].second.second); } else if (v[i].second.first) { Ymn=min(Ymn, v[i].second.second); Ymx=max(Ymx, v[i].second.second); } else { Xmn=min(Xmn, v[i].second.second); Xmx=max(Xmx, v[i].second.second); } if (i+2<=v.size() && (Xmx-Xmn+1)*(Ymx-Ymn+1)<=v[i+1].first) ans++; } return ans; } else { for (int i=a; i<b; i++) sum-=((xmx[i]-xmn[i]+1)*(ymx[i]-ymn[i]+1)==i+1); swap(x[a], x[b]); swap(y[a], y[b]); for (int i=a; i<b; i++) { if (!i) { xmn[i]=x[i]; ymn[i]=y[i]; xmx[i]=x[i]; ymx[i]=y[i]; } else { xmn[i]=min(xmn[i-1], x[i]); ymn[i]=min(ymn[i-1], y[i]); xmx[i]=max(xmx[i-1], x[i]); ymx[i]=max(ymx[i-1], y[i]); } sum+=((xmx[i]-xmn[i]+1)*(ymx[i]-ymn[i]+1)==i+1); } return sum; } }

컴파일 시 표준 에러 (stderr) 메시지

seats.cpp: In function 'int swap_seats(int, int)':
seats.cpp:66:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |         for (int i=0; i<v.size(); i++)
      |                       ~^~~~~~~~~
seats.cpp:86:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |             if (i+2<=v.size() && (Xmx-Xmn+1)*(Ymx-Ymn+1)<=v[i+1].first)
      |                 ~~~^~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...