Submission #47320

#TimeUsernameProblemLanguageResultExecution timeMemory
47320KmcodeCultivation (JOI17_cultivation)C++14
65 / 100
2053 ms5152 KiB
#include "bits/stdc++.h"
using namespace std;


#define MAX 2002

int n;
int r;
int c;

vector<pair<long long int, long long int> > v;


vector<long long int> vv;

struct st {
	map<long long int, int> mp;
	priority_queue<pair<long long int, long long int> > q;
	long long int las_up;
	long long int las_dw;
	long long int las_md;
	bool changu;
	bool changd;
	bool changm;
	st() {
		changu = changd=changm=true;
		
	}
	void ins(long long int val) {
		mp[val]++;
		changu = changd = changm = true;
		auto it = mp.lower_bound(val);
		if (next(it) != mp.end()) {
			q.push(make_pair((*next(it)).first - (*it).first, (*it).first));
		}
		if (it != mp.begin()) {
			q.push(make_pair(-(*prev(it)).first + (*it).first, (*prev(it)).first));
		}
	}
	void er(long long int val) {
		mp[val]--;
		changu = changd = changm = true;
		if (mp[val] == 0) {
			mp.erase(val);
			auto it = mp.lower_bound(val);
			if (it != mp.begin() && it != mp.end()) {
				q.push(make_pair(-(*prev(it)).first + (*it).first, (*prev(it)).first));
			}
		}
	}
	long long int up() {
		if (changu == false) {
			return las_up;
		}
		changu = false;
		if (mp.size() == 0) {
			las_up = LLONG_MAX / 100LL;
			return LLONG_MAX / 100LL;
		}
		las_up = (*mp.begin()).first;
		return las_up;
	}
	long long int dw() {
		if (changd == false) {
			return las_dw;
		}
		changd = false;
		if (mp.size() == 0) {
			las_dw = LLONG_MAX / 100LL;
			return LLONG_MAX / 100LL;
		}
		las_dw= r - (*mp.rbegin()).first - 1LL;
		return las_dw;
	}
	long long int mid() {
		if (changm == false) {
			return las_md;
		}
		changm = false;
		while (!q.empty()) {
			long long int n1 = q.top().second;
			long long int n2 = q.top().first + n1;
			if (mp.count(n1) == 0 || mp.count(n2) == 0) {
				q.pop();
				continue;
			}
			auto it = mp.upper_bound(n1);
			if ((*it).first != n2) {
				q.pop();
				continue;
			}
			las_md=n2 - n1 - 1LL;
			return las_md;
		}
		las_md = 0;
		return las_md;
	}
};

st z[2002];
vector<long long int> sear;

struct monotonic_queue {
	pair<long long int, int> v[2002];
	int fr;
	int bc;
	monotonic_queue() {
		fr = 0;
		bc = -1;
	}
	void monotonic_queue1() {
		fr = 0;
		bc = -1;
	}
	void add(pair<long long int, int> p) {
		while (bc>=fr&&v[bc].first <= p.first) {
			bc--;
		}
		v[bc + 1] = p;
		bc++;
	}
	long long int gt(long long int ic) {
		while (sear[v[fr].second] >= ic + c) {
			fr++;
		}
		return v[fr].first;
	}
};
vector<long long int> mg(vector<long long int> &a, vector<long long int> &b) {
	vector<long long int> r;
	int aa = 0;
	int bb = 0;
	while (aa < a.size() || bb < b.size()) {
		if (bb<b.size() && r.size() && r.back() == b[bb]) {
			bb++;
			continue;
		}
		if (aa<a.size() && r.size() && r.back() == a[aa]) {
			aa++;
			continue;
		}
		if (bb<b.size() && (aa == a.size() || a[aa]>b[bb])) {
			r.push_back(b[bb]);
			bb++;
			continue;
		}
		r.push_back(a[aa]);
		aa++;
		continue;
	}
	return r;
}
bool cmp(pair<long long int, long long int> a, pair<long long int, long long int> b) {
	return a.second < b.second;
}


vector<int> las;

long long int u1[MAX];
long long int d1[MAX];
long long int md1[MAX];

monotonic_queue u2;
monotonic_queue d2;
monotonic_queue md2;
int main() {
	scanf("%d%d", &r, &c);
	cin >> n;
	long long int mint = LLONG_MAX;
	long long int maxt = 0;
	for (int i = 0; i < n; i++) {
		int a, b;
		scanf("%d%d", &a, &b);
		a--;
		b--;
		v.push_back(make_pair(a, b));
		mint = min(mint, (long long int)b);
		maxt = max(maxt, (long long int)b);
	}
	for (int i = 0; i < v.size(); i++) {
		sear.push_back(v[i].second + c);
		sear.push_back(v[i].second);
		sear.push_back(v[i].second - c);
	}
	sort(sear.begin(), sear.end());
	sear.erase(unique(sear.begin(), sear.end()), sear.end());
	maxt = c - maxt - 1LL;
	long long int lef_least = mint;
	long long int rig_least = maxt;
	maxt += mint;
	vv.push_back(0);
	v.push_back(make_pair(0, c - 1));
	v.push_back(make_pair(0, 0));
	for (int i = 0; i < v.size(); i++) {
		for (int j = 0; j < v.size(); j++) {
			vv.push_back(v[i].second + c - v[j].second - 1);
			vv.push_back(max(0LL, abs(v[j].second - v[i].second) - 1));
		}
	}
	v.pop_back();
	v.pop_back();
	vv.push_back(maxt);
	sort(vv.begin(), vv.end());
	vv.erase(unique(vv.begin(), vv.end()), vv.end());
	long long int ans = LLONG_MAX;
	sort(v.begin(), v.end(), cmp);
	for (int j = 0; j < v.size(); j++) {
		int id1 = lower_bound(sear.begin(), sear.end(), v[j].second) - sear.begin();
		id1--;
		las.push_back(id1);
	}
	for (int i = 0; i < vv.size(); i++) {
		if (vv[i] < maxt)continue;
		for (int j = 0; j < v.size(); j++) {
			for (int k = las[j] + 1;k+1<sear.size()&&sear[k+1]<=v[j].second+vv[i]+1LL; k++) {
				las[j] = k;
				z[k].ins(v[j].first);
			}
		}
		for (int j = 0; j < sear.size(); j++) {
			u1[j] = z[j].up();
			d1[j]= z[j].dw();
			md1[j] = z[j].mid();
		}
		u2.monotonic_queue1();
		d2.monotonic_queue1();
		md2.monotonic_queue1();
		int idx = sear.size() - 1;
		for (int j = sear.size() - 1; j >= 0; j--) {
			u2.add(make_pair(u1[j], j));
			d2.add(make_pair(d1[j], j));
			md2.add(make_pair(md1[j], j));
			while (sear[idx] > sear[j] + c) {
				idx--;
			}
			if (sear[idx]==sear[j]+c) {
				long long int need = u2.gt(sear[j]) + d2.gt(sear[j]) + max(0LL, md2.gt(sear[j]) - u2.gt(sear[j]) - d2.gt(sear[j]));
				ans = min(ans, need + vv[i]);
			}
		}
	}
	printf("%lld\n", ans);
	return 0;
}

Compilation message (stderr)

cultivation.cpp: In function 'std::vector<long long int> mg(std::vector<long long int>&, std::vector<long long int>&)':
cultivation.cpp:133:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (aa < a.size() || bb < b.size()) {
         ~~~^~~~~~~~~~
cultivation.cpp:133:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (aa < a.size() || bb < b.size()) {
                          ~~~^~~~~~~~~~
cultivation.cpp:134:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (bb<b.size() && r.size() && r.back() == b[bb]) {
       ~~^~~~~~~~~
cultivation.cpp:138:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (aa<a.size() && r.size() && r.back() == a[aa]) {
       ~~^~~~~~~~~
cultivation.cpp:142:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (bb<b.size() && (aa == a.size() || a[aa]>b[bb])) {
       ~~^~~~~~~~~
cultivation.cpp:142:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (bb<b.size() && (aa == a.size() || a[aa]>b[bb])) {
                       ~~~^~~~~~~~~~~
cultivation.cpp: In function 'int main()':
cultivation.cpp:181:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < v.size(); i++) {
                  ~~^~~~~~~~~~
cultivation.cpp:195:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < v.size(); i++) {
                  ~~^~~~~~~~~~
cultivation.cpp:196:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < v.size(); j++) {
                   ~~^~~~~~~~~~
cultivation.cpp:208:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int j = 0; j < v.size(); j++) {
                  ~~^~~~~~~~~~
cultivation.cpp:213:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < vv.size(); i++) {
                  ~~^~~~~~~~~~~
cultivation.cpp:215:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < v.size(); j++) {
                   ~~^~~~~~~~~~
cultivation.cpp:216:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int k = las[j] + 1;k+1<sear.size()&&sear[k+1]<=v[j].second+vv[i]+1LL; k++) {
                            ~~~^~~~~~~~~~~~
cultivation.cpp:221:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < sear.size(); j++) {
                   ~~^~~~~~~~~~~~~
cultivation.cpp:189:16: warning: unused variable 'lef_least' [-Wunused-variable]
  long long int lef_least = mint;
                ^~~~~~~~~
cultivation.cpp:190:16: warning: unused variable 'rig_least' [-Wunused-variable]
  long long int rig_least = maxt;
                ^~~~~~~~~
cultivation.cpp:168: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:174:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &a, &b);
   ~~~~~^~~~~~~~~~~~~~~~
#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...