Submission #113859

#TimeUsernameProblemLanguageResultExecution timeMemory
113859BruteforcemanCultivation (JOI17_cultivation)C++11
5 / 100
2047 ms476 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];
     
    long long 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, up, down;
     
    	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);
    			up.push_back(inf);
    			down.push_back(inf);
    		} else {
    			int opt;
    			if(!diff.empty()) {
    				opt = *diff.rbegin() - 1;
    			} else opt = 0;
    			val.push_back(opt);
    			up.push_back(*s.begin() - 1);
    			down.push_back(C - *s.rbegin());
    		}
    		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]));
    		}
    	}
    	// for(int i = 0; i < sz.size(); i++) {
    	// 	cout << sz[i] << ' ' << val[i] << ' ' << up[i] << ' ' << down[i] << endl;
    	// }
    	multiset <int> cont, upC, downC;
    	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]);
    			upC.insert(up[r]);
    			downC.insert(down[r]);
    			++r;
    		}
    		if(sum >= R) {
    			ans = min(ans, max(*upC.rbegin() + *downC.rbegin(), *cont.rbegin()));
    		}
    		prev += sz[i];
    		sum -= sz[i];
    		cont.erase(cont.find(val[i]));
			upC.erase(upC.find(up[i]));
			downC.erase(downC.find(down[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]);
    	}	
    	long long ans = getOpt(0);
    	for(int i = 1; i <= n; i++) {
    		for(int j = i; 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("%lld\n", ans);
    	return 0;
    }

Compilation message (stderr)

cultivation.cpp: In function 'long long int getOpt(int)':
cultivation.cpp:52:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int i = 1; i < v.size(); i += 2) {
                     ~~^~~~~~~~~~
cultivation.cpp:126:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int i = 0; i < sz.size(); i++) {
                     ~~^~~~~~~~~~~
cultivation.cpp:128:15: 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:149:11: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
      scanf("%d %d", &R, &C);
      ~~~~~^~~~~~~~~~~~~~~~~
cultivation.cpp:150:11: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
      scanf("%d", &n);
      ~~~~~^~~~~~~~~~
cultivation.cpp:152:12: 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...