#include "railroad.h"
#include<iostream>
#include<vector>
#include<queue>
#include<deque>
#include<string>
#include<fstream>
#include<algorithm>
#include <iomanip>
#include<map>
#include <set>
#include <unordered_map>
#include <stack>
#include <unordered_set>
#include <cmath>
#include <cstdint>
#include <cassert>
#include <bitset>
#include <random>
#include <chrono>
#include <cstring>
#define shit short int
#define ll long long
#define ld long double
//#define int ll
#define For(i, n) for(int i = 0; i < (int)n; i++)
#define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++)
#define rfor(i, n) for(int i = (int)n; i >= (int)0; i--)
#define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--)
#define vec vector
#define ff first
#define ss second
#define pb push_back
#define pii pair<int, int>
#define pld pair<ld, ld>
#define NEK 2000000000000000
#define mod 1000000007
#define mod2 1000000009
#define rsz resize
#define prv 43
#define prv2 47
#define D 8
#define trav(a,x) for (auto& a: x)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define all(x) (x).begin(), (x).end()
#define sig 0.0000001
using namespace std;
ll pomale(vec<int>&s, vec<int>&t) {
int n = s.size();
vec<vec<ll>> dp((1 << n), vec<ll>(n, NEK));
For(i, n) {
dp[(1<<i)][i] = 0;
}
ffor(i, 1, (1<<n)) {
For(j, n) {
if (!((1 << j) & i)) continue;
For(k, n) {
if (k == j) continue;
if (!((1 << k) & i)) continue;
dp[i][j] = min(dp[i][j], dp[i - (1 << j)][k] + max((ll)0, (ll)t[k] - (ll)s[j]));
}
}
}
ll mini = NEK;
For(i, n) {
mini = min(mini, dp[(1 << n) - 1][i]);
}
return mini;
}
ll rychle(vec<int>& s, vec<int>& t) {
//vsetko parne
map<int, int> umap;
set<int> roz;
map<int, vec<int>> g;
int n = s.size();
int mini = 1000000001;
For(i, n) {
roz.insert(s[i]);
roz.insert(t[i]);
umap[s[i]]--;
umap[t[i]]++;
mini = min(mini, s[i]);
mini = min(mini, t[i]);
g[s[i]].push_back(t[i]);
}
int pocet_roz = roz.size();
int zdola = 0;
bool zle = 0;
int pr = 0;
map<int, vec<int>> g2 = g;
for (auto i : umap) {
if (zdola != 0) {
g2[pr].push_back(i.ff);
}
pr = i.ff;
int hod = i.ss + zdola;
if (hod < 0) {
zle = 1;
break;
}
zdola = hod;
}
if (zdola != 0) zle = 1;
if (zle == 0) {
set<int> bol;
queue<int> q;
q.push(mini);
while (!q.empty()) {
int x = q.front(); q.pop();
if (bol.find(x) != bol.end()) continue;
bol.insert(x);
for (auto i : g2[x]) {
q.push(i);
}
}
if(bol.size() == pocet_roz) return 0;
}
zle = 0;
zdola = umap[mini];
if (zdola < (-1)) return 1;
zdola++;
int prvy = 0;
pr = 0;
for (auto i : umap) {
if (prvy == 0) {
prvy = 1;
pr = i.ff;
continue;
}
if (zdola != 0) {
g[pr].push_back(i.ff);
}
pr = i.ff;
int hod = i.ss + zdola;
if (hod < 0) {
zle = 1;
break;
}
zdola = hod;
}
if (zdola != 1) zle = 1;
if (zle == 0) {
set<int> bol;
queue<int> q;
q.push(mini);
while (!q.empty()) {
int x = q.front(); q.pop();
if (bol.find(x) != bol.end()) continue;
bol.insert(x);
for (auto i : g[x]) {
q.push(i);
}
}
if (bol.size() == pocet_roz) return 0;
}
return 1;
}
long long plan_roller_coaster(vector<int> s, vector<int> t) {
int n = s.size();
if (n <= 16) return pomale(s, t);
return rychle(s, t);
}
/*
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n; cin >> n;
vec<int> s(n), t(n);
For(i, n) {
cin >> s[i] >> t[i];
}
cout << plan_roller_coaster(s, t) << '\n';
return 0;
}*/
Compilation message (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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |