Submission #77220

#TimeUsernameProblemLanguageResultExecution timeMemory
77220shoemakerjoRoller Coaster Railroad (IOI16_railroad)C++14
100 / 100
1461 ms158008 KiB
#include "railroad.h"
#include <bits/stdc++.h>
 
#define ll long long
using namespace std;
 
#define maxv 400010
#define mp make_pair
 
vector<ll> nums;
vector<int> adj[maxv];
int par[maxv];
 
const int inf = 1000000010;
 
int findset(int u) {
	if (par[u] == u) return u;
	return par[u] = findset(par[u]);
}
 
void unionset(int u, int v) {
	u = findset(u);
	v = findset(v);
	if (u != v) {
		if (rand() % 2) { //lazy dsu
			par[u] = v;
		}
		else par[v] = u;
	}
}
 
map<ll, int> indo;
int delt[maxv];
 
 
ll plan_roller_coaster(vector<int> s, vector<int> t) {
	srand(23);
    int n = (int) s.size();
    set<int> og;
    for (int v : s)  og.insert(v);
   	for (int v : t) og.insert(v);
   	og.insert(1);
   	og.insert(inf);
   	for (int v : og) nums.push_back(v);
 
   	for (int i = 0; i < nums.size(); i++) {
   		indo[nums[i]] = i;
   		par[i] = i; //setting up the dsu for later
   	}
 
   	// cout << "here 1" << endl; 
 
   	for (int i = 0; i < s.size(); i++) {
   		adj[indo[s[i]]].push_back(indo[t[i]]);
   		// cout << s[i] << " to " << t[i] << " is: " << endl;
   		// cout << "   " << indo[s[i]] << " to " << indo[t[i]] << endl;
   	}
   	adj[indo[inf]].push_back(indo[1]);
   	// cout << "last guy is " << indo[inf] << " to " << indo[1] << endl;
 
   	ll ans = 0LL;
 
   	// cout << "here 2 " << endl;
 
 
   	for (int i = 0; i < nums.size(); i++) {
   		for (int v : adj[i]) {
   			if (v >= i) {
   				delt[i]++;
   				delt[v]--;
 
   			}
   			else {
		   		delt[v]--;
		   		delt[i]++;
		   	}
   		}
   		
   	}
 
   	// cout << "here 3" << endl;
 
   	int curval = 0;
   	for (int i = 0; i < nums.size()-1; i++) {
   		curval += delt[i];
   		// cout << i << " " << nums[i] << " : " << curval << endl;
   		// cout << "    " << delt[i]  << endl;
 
   		if (curval > 0) {
   			// cout << i << " is positive! " << endl;
   			ans += curval * (nums[i+1]-nums[i]);
   			adj[i+1].push_back(i);
   		}
   		else if (curval < 0) {
   			adj[i].push_back(i+1);
   		}
   	}
 
   	vector<pair<ll, int>> edges; 
   	//the first is the lenght, the second is the starting guy
   	for (int i = 0; i < nums.size()-1; i++) {
   		edges.push_back(mp(nums[i+1]-nums[i], i));
   	}
   	sort(edges.begin(), edges.end());
 
   	for (int i = 0; i < nums.size(); i++) {
   		for (int v : adj[i]) unionset(i, v);
   	}
 
   	for (int i = 0; i < edges.size(); i++) {
   		if (findset(edges[i].second) != findset(edges[i].second+1)) {
   			unionset(edges[i].second, edges[i].second+1);
   			ans += edges[i].first;
   		}
   	}
 
    return ans;
}

Compilation message (stderr)

railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:46:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < nums.size(); i++) {
                     ~~^~~~~~~~~~~~~
railroad.cpp:53:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < s.size(); i++) {
                     ~~^~~~~~~~~~
railroad.cpp:66:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < nums.size(); i++) {
                     ~~^~~~~~~~~~~~~
railroad.cpp:84:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < nums.size()-1; i++) {
                     ~~^~~~~~~~~~~~~~~
railroad.cpp:101:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < nums.size()-1; i++) {
                     ~~^~~~~~~~~~~~~~~
railroad.cpp:106:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < nums.size(); i++) {
                     ~~^~~~~~~~~~~~~
railroad.cpp:110:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < edges.size(); i++) {
                     ~~^~~~~~~~~~~~~~
railroad.cpp:38:9: warning: unused variable 'n' [-Wunused-variable]
     int n = (int) s.size();
         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...