Submission #55293

#TimeUsernameProblemLanguageResultExecution timeMemory
55293ksun48Cultivation (JOI17_cultivation)C++14
60 / 100
2070 ms1116 KiB
#include <bits/stdc++.h> using namespace std; typedef int LL; LL r, c, n; vector<pair<LL,LL> > seeds; const LL INF = 2100100100; LL best = INF; set<LL> tried; void tryxfast(LL x){ if(x < 0 || tried.find(x) != tried.end()){ return; } tried.insert(x); map<LL, vector<pair<LL, LL> > > events; for(pair<LL,LL> z : seeds){ events[z.first - x].push_back({0, z.second}); // ins events[z.first + 1].push_back({1, z.second}); // del } vector<LL> pos; vector<LL> ups; vector<LL> downs; vector<LL> totals; multiset<LL> grass; grass.insert(-1); grass.insert(c); multiset<LL> diffs; diffs.insert(-(c+1)); for(auto tt : events){ for(pair<LL,LL> event : tt.second){ LL a = event.second; if(event.first == 0){ grass.insert(a); } LL a1 = *(--grass.find(a)); LL a2 = *(++grass.find(a)); if(event.first == 0){ diffs.erase(diffs.find(a1-a2)); diffs.insert(a1-a); diffs.insert(a-a2); } else if(event.first == 1){ diffs.erase(diffs.find(a1-a)); diffs.erase(diffs.find(a-a2)); diffs.insert(a1-a2); } if(event.first == 1){ grass.erase(grass.find(a)); } } pos.push_back(tt.first); totals.push_back( -*diffs.begin() ); ups.push_back( *(++grass.begin()) - 0 ); downs.push_back( c-1 - *(--(--grass.end())) ); } // two pointers: LL j = 0; multiset<LL> upset; multiset<LL> downset; multiset<LL> totalset; for(LL i = 0; i < pos.size(); i++){ while(j < pos.size() && pos[j] <= pos[i] + r - 1){ upset.insert(-ups[j]); downset.insert(-downs[j]); totalset.insert(-totals[j]); j++; } LL total = -*totalset.begin(); if(total < c+1){ best = (int)min((long long)best, max((long long)-*upset.begin() + (long long)-*downset.begin(), (long long)total - 1) + (long long)x); } upset.erase(upset.find(-ups[i])); downset.erase(downset.find(-downs[i])); totalset.erase(totalset.find(-totals[i])); } } int main(){ cin.sync_with_stdio(0); cin.tie(0); cin >> r >> c >> n; for(LL i = 0; i < n; i++){ LL s, e; cin >> s >> e; s--; e--; seeds.push_back({s,e}); } sort(seeds.begin(), seeds.end()); for(LL i = 0; i < n; i++){ for(LL j = 0; j < n; j++){ tryxfast(seeds[i].first + r-1 - seeds[j].first); tryxfast(seeds[i].first - 1 - seeds[j].first); } } cout << best << '\n'; }

Compilation message (stderr)

cultivation.cpp: In function 'void tryxfast(LL)':
cultivation.cpp:63:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(LL i = 0; i < pos.size(); i++){
                ~~^~~~~~~~~~~~
cultivation.cpp:64:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(j < pos.size() && pos[j] <= pos[i] + r - 1){
         ~~^~~~~~~~~~~~
#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...