제출 #1136967

#제출 시각아이디문제언어결과실행 시간메모리
1136967the_coding_poohRoller Coaster Railroad (IOI16_railroad)C++20
30 / 100
211 ms15964 KiB
#include "railroad.h"
#include <bits/stdc++.h>

using namespace std;

#define uwu return
#define ALL(x) x.begin(), x.end()

#define fs first
#define sc second

vector <int> discrete;

const int SIZE = 8e5 + 5;

int direct[SIZE], dsu[SIZE];

int get_id(int i){
	return lower_bound(ALL(discrete), i) - discrete.begin();
}

long long dist(int a, int b){
	if(a > b) swap(a, b);
	return discrete[b] - discrete[a];
}

int pa(int a){
	return dsu[a] < 0 ? a : dsu[a] = pa(dsu[a]);
}

bool merge(int a, int b){
	a = pa(a),  b = pa(b);
	if(a == b) return 0;
	if(dsu[a] < dsu[b])
		swap(a, b);
	dsu[b] += dsu[a];
	dsu[a] = b;
	return 1;
}

long long plan_roller_coaster(vector<int> s, vector<int> t) {
    int n = (int) s.size() + 1;
	int mx = 0;
	for(auto i:s){
		discrete.push_back(i);
		mx = max(mx,  i);
	}
	for(auto i:t){
		discrete.push_back(i);
		mx = max(mx,  i);
	}

	discrete.push_back(1);
    discrete.push_back(mx + 1);
	s.push_back(mx + 1);
	t.push_back(1);
	sort(ALL(discrete));
	discrete.erase(unique(ALL(discrete)));
	
	int C = discrete.size();
	for(int i = 0; i < C; i++){
		dsu[i] = -1;
	}
	long long ans = 0;
	for(int i = 0; i < n; i++){
		direct[get_id(s[i])]++;
		direct[get_id(t[i])]--;
		merge(get_id(s[i]), get_id(t[i]));
	}
	vector <pair<int, pair<int, int>>> connect_cc;
	for(int i = 0; i < C - 1; i++){
		ans += max(direct[i], 0) * dist(i, i + 1);
		if(direct[i])
			merge(i, i + 1);	
		direct[i + 1] += direct[i]; 
		connect_cc.push_back({dist(i, i + 1), {i, i + 1}});
	}
	sort(ALL(connect_cc));
	for(auto i:connect_cc){
		if(merge(i.sc.fs, i.sc.sc))
			ans += i.fs;
	}
	uwu ans;
}

컴파일 시 표준 에러 (stderr) 메시지

railroad.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
railroad_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...