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...