Submission #77215

# Submission time Handle Problem Language Result Execution time Memory
77215 2018-09-24T02:40:56 Z shoemakerjo Roller Coaster Railroad (IOI16_railroad) C++14
30 / 100
1527 ms 157772 KB
#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]-nums[i-1]);
   			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

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 time Memory Grader output
1 Correct 10 ms 9720 KB n = 2
2 Correct 11 ms 9976 KB n = 2
3 Correct 10 ms 9976 KB n = 2
4 Correct 10 ms 9984 KB n = 2
5 Correct 10 ms 9984 KB n = 2
6 Incorrect 10 ms 9988 KB answer is not correct: 69049296 instead of 523688153
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 9720 KB n = 2
2 Correct 11 ms 9976 KB n = 2
3 Correct 10 ms 9976 KB n = 2
4 Correct 10 ms 9984 KB n = 2
5 Correct 10 ms 9984 KB n = 2
6 Incorrect 10 ms 9988 KB answer is not correct: 69049296 instead of 523688153
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1507 ms 87936 KB n = 199999
2 Correct 1527 ms 92012 KB n = 199991
3 Correct 1451 ms 96008 KB n = 199993
4 Correct 1047 ms 96008 KB n = 152076
5 Correct 529 ms 96008 KB n = 93249
6 Correct 1253 ms 96008 KB n = 199910
7 Correct 1338 ms 104876 KB n = 199999
8 Correct 1187 ms 104876 KB n = 199997
9 Correct 1226 ms 104876 KB n = 171294
10 Correct 913 ms 104876 KB n = 140872
11 Correct 1145 ms 107180 KB n = 199886
12 Correct 1269 ms 120048 KB n = 199996
13 Correct 1195 ms 120048 KB n = 200000
14 Correct 1259 ms 125512 KB n = 199998
15 Correct 1178 ms 127480 KB n = 200000
16 Correct 1207 ms 132936 KB n = 199998
17 Correct 1146 ms 137100 KB n = 200000
18 Correct 1284 ms 137512 KB n = 190000
19 Correct 1048 ms 137512 KB n = 177777
20 Correct 506 ms 137512 KB n = 100000
21 Correct 1236 ms 149956 KB n = 200000
22 Correct 1270 ms 153888 KB n = 200000
23 Correct 1263 ms 157772 KB n = 200000
# Verdict Execution time Memory Grader output
1 Correct 10 ms 9720 KB n = 2
2 Correct 11 ms 9976 KB n = 2
3 Correct 10 ms 9976 KB n = 2
4 Correct 10 ms 9984 KB n = 2
5 Correct 10 ms 9984 KB n = 2
6 Incorrect 10 ms 9988 KB answer is not correct: 69049296 instead of 523688153
7 Halted 0 ms 0 KB -