제출 #110488

#제출 시각아이디문제언어결과실행 시간메모리
110488tincamateiCultivation (JOI17_cultivation)C++14
15 / 100
2059 ms384 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 300;

struct Cell {
	int l, c;
}v[MAX_N];

bool cmp(Cell a, Cell b) {
	return a.l < b.l;
}

struct Range {
	int l, r, dep;
	
	inline bool operator< (const Range &x) const {
		return l < x.l;
	}
};

int dif;
set<Range> ranges;

int expup, expdown, middle;

void insertRange(int l, int r, int dep) {
	set<Range>::iterator it, it2;
	vector<Range> toerase, toadd;

	it = ranges.lower_bound({l, 0, 0});
	if(it != ranges.begin()) {
		it2 = it;
		it2--;

		if(it2->r >= l) {
			if(it2->dep == 0)
				expup = max(expup, dep - it2->dep - 1);
			else
				middle = max(middle, dep - it2->dep - 1);
	
			toerase.push_back(*it2);
			if(it2->l < l)
				toadd.push_back({it2->l, l - 1, it2->dep});
			if(it2->r > r)
				toadd.push_back({r + 1, it2->r, it2->dep});
		}
	}

	while(it != ranges.end() && it->l <= r) {
		toerase.push_back(*it);
		
		if(it->dep == 0)
			expup = max(expup, dep - it->dep - 1);
		else
			middle = max(middle, dep - it->dep - 1);
		
		if(it->r > r)
			toadd.push_back({r + 1, it->r, it->dep});
		it++;
	}

	toadd.push_back({l, r, dep});

	for(auto it: toerase)
		ranges.erase(it);
	for(auto it: toadd)
		ranges.insert(it);
}

long long expand(int n, int r, int c, int expleft, int expright) {
	ranges.clear();
	ranges.insert({1, c, 0});
	
	expup = expdown = middle = 0;
	
	for(int i = 0; i < n; ++i) {
		insertRange(max(1, v[i].c - expleft), min(c, v[i].c + expright), v[i].l);
	}

	for(auto it: ranges)
		if(it.dep == 0) // empty gap
			return 1LL << 35;
		else
			expdown = max(expdown, r - it.dep);

	return expleft + expright + max(middle, expup + expdown);
}

long long getsol(int n, int r, int c) {
	int necleft, necright;
	long long rez = 1LL<<35;

	necleft = necright = 1000000001;

	for(int i = 0; i < n; ++i) {
		necleft = min(necleft, v[i].c - 1);
		necright = min(necright, c - v[i].c);
	}

	for(int expleft = necleft; expleft <= c; ++expleft)
		for(int expright = necright; expright <= c; ++expright)
			rez = min(rez, expand(n, r, c, expleft, expright));

	return rez;
}

int main() {
#ifdef HOME
	FILE *fin = fopen("input.in", "r");
	FILE *fout = fopen("output.out", "w");
#else
	FILE *fin = stdin;
	FILE *fout = stdout;
#endif

	int n, r, c;
	fscanf(fin, "%d%d", &r, &c);
	fscanf(fin, "%d", &n);

	for(int i = 0; i < n; ++i)
		fscanf(fin, "%d%d", &v[i].l, &v[i].c);
	
	sort(v, v + n, cmp);

	fprintf(fout, "%lld", getsol(n, r, c));

	fclose(fin);
	fclose(fout);
	return 0;
}

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

cultivation.cpp: In function 'int main()':
cultivation.cpp:119:8: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  fscanf(fin, "%d%d", &r, &c);
  ~~~~~~^~~~~~~~~~~~~~~~~~~~~
cultivation.cpp:120:8: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  fscanf(fin, "%d", &n);
  ~~~~~~^~~~~~~~~~~~~~~
cultivation.cpp:123:9: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   fscanf(fin, "%d%d", &v[i].l, &v[i].c);
   ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...