답안 #59828

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
59828 2018-07-23T07:39:35 Z koosaga(#1721) Cultivation (JOI17_cultivation) C++11
0 / 100
2000 ms 488 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef long double llf;
typedef pair<int, int> pi;
const int MAXN = 305;

int n, r, c;
pi a[MAXN];

struct sweep{
	int pos, val, mode;
	bool operator<(const sweep &s)const{
		return pi(pos, -mode) < pi(s.pos, -s.mode);
	}
};

lint Do(vector<sweep> sw){
	vector<int> v = {1, r + 1};
	for(int i=0; i<sw.size(); i++){ 
		v.push_back(sw[i].pos);
	}
	sort(sw.begin(), sw.end());
	sort(v.begin(), v.end());
	v.resize(unique(v.begin(), v.end()) - v.begin());
	multiset<int> s;
	int ptr = 0;
	int lv = 0, rv = 0, sum = 0;
	for(int i=0; i+1<v.size(); i++){
		while(ptr < sw.size() && sw[ptr].pos == v[i]){
			if(sw[ptr].mode == 1) s.insert(sw[ptr].val);
			else s.erase(s.find(sw[ptr].val));
			ptr++;
		}
		if(s.size() == 0) return 1e18;
		lv = max(lv, *s.begin() - 1);
		rv = max(rv, c - *s.rbegin());
		auto it = s.begin();
		while(next(it) != s.end()){
			auto in = next(it);
			sum = max(*in - *it - 1, sum);
			it = in;
		}
	}
	if(lv + rv < sum){
		return 2 * lv + sum - lv;
	}
	return 2 * lv + rv;
}

lint solve(){
	lint ans = 1e18;
	for(int i=0; i<=r-1; i++){
		for(int j=0; i+j<=r-1; j++){
			vector<sweep> sw;
			for(int k=0; k<n; k++){
				int le = max(1, a[k].first - i);
				int ri = min(r, a[k].first + j);
				int v = a[k].second;
				sw.push_back({le, v, +1});
				sw.push_back({ri + 1, v, -1});
			}
			ans = min(ans, 2ll * i + j + Do(sw));
		}
	}
	return ans;
}

int main(){
	cin >> r >> c >> n;
	for(int i=0; i<n; i++){
		cin >> a[i].first >> a[i].second;
	}
	lint ans = 1e18;
	for(int i=0; i<4; i++){
		for(int j=0; j<n; j++){
			if(i & 2) a[j].first = r + 1 - a[j].first;
			if(i & 1) a[j].second = c + 1 - a[j].second;
		}
		ans = min(ans, solve());
		for(int j=0; j<n; j++){
			if(i & 2) a[j].first = r + 1 - a[j].first;
			if(i & 1) a[j].second = c + 1 - a[j].second;
		}
	}
	cout << ans << endl;
}

Compilation message

cultivation.cpp: In function 'lint Do(std::vector<sweep>)':
cultivation.cpp:20:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<sw.size(); i++){
               ~^~~~~~~~~~
cultivation.cpp:29:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i+1<v.size(); i++){
               ~~~^~~~~~~~~
cultivation.cpp:30:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(ptr < sw.size() && sw[ptr].pos == v[i]){
         ~~~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 252 KB Output is correct
2 Incorrect 3 ms 488 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 252 KB Output is correct
2 Incorrect 3 ms 488 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 252 KB Output is correct
2 Incorrect 3 ms 488 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2007 ms 488 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2007 ms 488 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 252 KB Output is correct
2 Incorrect 3 ms 488 KB Output isn't correct
3 Halted 0 ms 0 KB -