Submission #1242455

#TimeUsernameProblemLanguageResultExecution timeMemory
1242455nvujicaSky Walking (IOI19_walk)C++20
33 / 100
127 ms17712 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#include "walk.h"

using namespace std;

const int maxn = 1e5 + 10;
const ll inf = (1LL << 60);

vector<int> poc[maxn];
vector <int> kraj[maxn];
set <pair<int, ll> > s;
map<int, int> mp;

ll min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int st, int g) {
	int n = x.size();
	int m = l.size();
	
	ll ans = x[n - 1] - x[0];

	for(int i = 0; i < m; i++){
		poc[l[i]].push_back(y[i]);
		kraj[r[i]].push_back(y[i]);
	}

	s.insert({0, 0});
	kraj[0].push_back(0);

	// for(int i = 0; i < poc[0].size(); i++){
	// 	int vis = poc[0][i];
		
	// 	s.insert({vis, vis});
	// }

	for(int i = 0; i < n - 1; i++){
		// cout << "tui " << i << ' ' << s.size() << endl;

		if(s.empty()) return -1;

		mp.clear();

		for(int j = 0; j < poc[i].size(); j++){
			int vis = poc[i][j];

			// if(mp.find(vis) != mp.end()){
			// 	s.insert({vis, mp[vis]});
			// 	continue;
			// }
			
			ll cost = inf;

			auto it = s.lower_bound({vis, 0});

			if(it != s.end() && (*it).fi == vis){
				mp[vis] = 1;
				continue;
			}
			if(it != s.end() && (*it).fi <= h[i]) cost = (*it).se + (*it).fi - vis;
			if(it != s.begin()){
				it--;
				cost = min(cost, (*it).se + vis - (*it).fi);
			}
			s.insert({vis, cost});
			//cout << "insert: " << vis << ' ' << cost << endl;
		}

		for(int j = 0; j < kraj[i].size(); j++){
			int vis = kraj[i][j];

			auto it = s.lower_bound({vis, 0});
			ll cost = (*it).se;
			// mp[vis] = cost;

			it++;
			if(it != s.end() && (*it).fi <= h[i]){
				ll c = cost + (*it).fi - vis;
				
				if(c < (*it).se){
					int vis2 = (*it).fi;
					s.erase(it);
					s.insert({vis2, c});
				}
				// (*it).se = min((*it).se, cost + (*it).fi - vis);
			}
			
			it = s.lower_bound({vis, 0});
			
			if(it != s.begin()){
				it--;
				ll c = cost + vis - (*it).fi;

				//(*it).se = min((*it).se, cost + vis - (*it).fi);
				if(c < (*it).se){
					int vis2 = (*it).fi;
					s.erase(it);
					s.insert({vis2, c});
				}
				
				it++;
			}

			if(mp[vis] == 0){
				//cout << "erase: " << vis << ' ' << cost << endl;
				s.erase({vis, cost});
			}
		}
	}

	if(s.empty()) return -1;

	ll naj = inf;

	auto it = s.begin();

	while(it != s.end()){
		naj = min(naj, (*it).fi + (*it).se);
		it++;
	}

	return ans + naj;
}
#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...