제출 #113852

#제출 시각아이디문제언어결과실행 시간메모리
113852BruteforcemanCultivation (JOI17_cultivation)C++11
0 / 100
10 ms512 KiB
#include "bits/stdc++.h" using namespace std; typedef pair <int, int> pii; int R, C; int x[305], y[305]; int n; const int inf = 1e9 + 7; vector <int> beg[605], fin[605]; int getOpt(int len) { // cout << len << endl; int mnX = inf; int mxX = -inf; for(int i = 1; i <= n; i++) { mnX = min(mnX, x[i]); mxX = max(mxX, x[i] + len); } set <pii> endp; map <int, int> com; for(int i = 1; i <= n; i++) { int l = x[i]; int r = x[i] + len; if(l > mnX) { endp.insert(pii(l - 1, 1)); } if(r < mxX) { endp.insert(pii(r + 1, -1)); } endp.insert(pii(l, -1)); endp.insert(pii(r, 1)); com[l]; com[r]; } vector <pii> v (endp.begin(), endp.end()); int idx = 0; for(auto &i : com) { i.second = ++idx; } for(int i = 0; i <= idx; i++) { beg[i].clear(); fin[i].clear(); } for(int i = 1; i <= n; i++) { int l = x[i]; int r = x[i] + len; beg[com[l]].push_back(i); fin[com[r]].push_back(i); } multiset <int> s; multiset <int> diff; vector <int> sz, val; for(int i = 1; i < v.size(); i += 2) { int l = v[i - 1].first; int r = v[i].first; int cmpL = com[l]; int cmpR = com[r]; for(auto j : beg[cmpL]) { s.insert(y[j]); auto it = s.lower_bound(y[j]); int prev = -1; int nxt = -1; if(it != s.begin()) { prev = *(--it); ++it; } ++it; if(it != s.end()) { nxt = *it; } if(prev != -1) { diff.insert(y[j] - prev); } if(nxt != -1) { diff.insert(nxt - y[j]); } if(prev != -1 && nxt != -1) { diff.erase(diff.find(nxt - prev)); } } sz.push_back(r - l + 1); if(s.empty()) { val.push_back(inf); } else { int opt = C - (*s.rbegin() - *s.begin() + 1); if(!diff.empty()) { opt = max(opt, *diff.rbegin() - 1); } val.push_back(opt); } for(auto j : fin[cmpR]) { auto it = s.lower_bound(y[j]); int prev = -1; int nxt = -1; if(it != s.begin()) { prev = *(--it); ++it; } ++it; if(it != s.end()) { nxt = *it; } if(prev != -1) { diff.erase(diff.find(y[j] - prev)); } if(nxt != -1) { diff.erase(diff.find(nxt - y[j])); } if(prev != -1 && nxt != -1) { diff.insert(nxt - prev); } s.erase(s.find(y[j])); } } multiset <int> cont; int r = 0; int sum = 0; int prev = 0; int ans = inf; for(int i = 0; i < sz.size(); i++) { if(prev > len + 1) break; while(r < sz.size() && sum < R) { sum += sz[r]; cont.insert(val[r]); ++r; } if(sum >= R) { ans = min(ans, *cont.rbegin()); } prev += sz[i]; sum -= sz[i]; cont.erase(cont.find(val[i])); } return ans; } int main(int argc, char const *argv[]) { scanf("%d %d", &R, &C); scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d %d", &x[i], &y[i]); } int ans = getOpt(0); for(int i = 1; i <= n; i++) { for(int j = i + 1; j <= n; j++) { int dif = abs(x[j] - x[i]) - 1; if(dif >= 0) { ans = min(ans, getOpt(dif) + dif); } dif = R - abs(x[j] - x[i]) - 1; if(dif >= 0) { ans = min(ans, getOpt(dif) + dif); } } } printf("%d\n", ans); return 0; }

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

cultivation.cpp: In function 'int getOpt(int)':
cultivation.cpp:52:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 1; i < v.size(); i += 2) {
                 ~~^~~~~~~~~~
cultivation.cpp:120:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < sz.size(); i++) {
                 ~~^~~~~~~~~~~
cultivation.cpp:122:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(r < sz.size() && sum < R) {
         ~~^~~~~~~~~~~
cultivation.cpp: In function 'int main(int, const char**)':
cultivation.cpp:139:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &R, &C);
  ~~~~~^~~~~~~~~~~~~~~~~
cultivation.cpp:140:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
cultivation.cpp:142:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &x[i], &y[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...