Submission #126361

#TimeUsernameProblemLanguageResultExecution timeMemory
126361SortingRoller Coaster Railroad (IOI16_railroad)C++14
0 / 100
152 ms14048 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 7;
const int M = (1 << 16) + 7;
const long long inf = 1e18 + 7;

pair<long long, bool> dp[M][19];
int n;
pair<int, int> p[N];

long long solve(int state, int pr = 17){
	if(dp[state][pr].second){
		return dp[state][pr].first;
	}
	if(state == (1 << n) - 1){
		return 0;
	}

	dp[state][pr].second = true;
	dp[state][pr].first = inf;

	long long curr;

	if(pr == 17){
		curr = 1;
	}
	else{
		curr = p[pr].second;
	}

	for(int i = 0; i < n; i++){
		if((1 << i) & state){
			continue;
		}

		dp[state][pr].first = min(dp[state][pr].first, solve(state | (1 << i), i) + max(curr - p[i].first, 0ll));
	}

	return dp[state][pr].first;
}

bool cmp(pair<long long, int> lvalue, pair<long long, int> rvalue){
	if(lvalue.first != rvalue.first){
		return lvalue.first < rvalue.first;
	}

	return lvalue.second < rvalue.second;
}

long long plan_roller_coaster(vector<int> s, vector<int> t){
	n = (int)s.size();

	for(int i = 0; i < n; i++){
		p[i] = {s[i], t[i]};
	}

	/*if(n <= 16){
		return solve(0);
	}*/

	vector<pair<long long, int> > v;
	bool eq = false;

	for(int i = 0; i < n; i++){
		if(s[i] < t[i]){
			v.push_back({s[i], 1});
			v.push_back({t[i], 2});
		}
		else if(s[i] > t[i]){
			v.push_back({t[i], 3});
			v.push_back({s[i], 4});
		}

		if(s[i] == t[i]){
			v.push_back({s[i], 1});
			v.push_back({t[i], 2});
		}
	}

	v.push_back({inf, 4});
	v.push_back({1, 3});

	sort(v.begin(), v.end(), cmp);

	int a = 0, b = 0;

	for(int i = 0; i < (int)v.size(); i++){
		//cout << v[i].first << " v[i] " << v[i].second << endl;

		switch(v[i].second){
			case 1:
				a++;
				break;
			case 2:
				a--;
				break;
			case 3:
				b++;
				break;
			case 4:
				b--;
				break;
		}

		if(b < a){
			return 1;
		}

		if(b == 0 && v[i].first != inf){
			return 1;
		}
	}

	return 0;
}

/*int main(){
	int nn;

	cin >> nn;

	vector<int> s, t;

	for(int i = 0; i < nn; i++){
		int x, y;

		cin >> x >> y;

		s.push_back(x);
		t.push_back(y);
	}

	cout << plan_roller_coaster(s, t) << endl;
	cout << solve(0) << endl;

	return 0;
}*/

Compilation message (stderr)

railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:64:7: warning: unused variable 'eq' [-Wunused-variable]
  bool eq = false;
       ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...