# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
849170 | not_from_here | 경주 (Race) (IOI11_race) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// ඞ
#pragma GCC optimize("Ofast")
//#pragma GCC target("popcnt")
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#ifdef LOCAL
#include "debug.h"
#define dbg(...) debug_out(splitter(#__VA_ARGS__), 0, __LINE__, __VA_ARGS__)
#else
#define dbg(...)
#endif
#define int long long
#define itn int
#define ALL(v) (v).begin(), (v).end()
#define mem(a, x) memset(a , x , sizeof(a))
#define f first
#define s second
#define mb make_pair
#define pb push_back
#define popCnt __builtin_popcountll
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<vector<int>> vvi;
typedef pair <int, int> pii;
typedef vector<pair <int, int>> vpii;
typedef vector<vector<char>> vvc;
const int mod = 1e9 + 7;
const int oo = 0x5f5f5f5f;
const long double PI = acos(-1.0L);
int ceiledLog2 (int x){return __lg(x) + (__builtin_popcount(x) != 1);}
ll toLL (int first, int second, int mx){return (1LL*first*mx) + second;}
template <class T, class U> T GCD (T a, U b) {return (!b ? a : GCD(b, a%b));}
template <class T, class U> T LCM (T a, U b) {return ((a/GCD(a, b)) * b);}
template <class T> bool isSquare (T n) {T sq = sqrt(n); return (sq*sq)==n;}
template <typename T> T Unique(T x){sort(ALL(x));x.resize(distance(x.begin(),unique(ALL(x))));return x;}
template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
//bool sortBySecond (pii &a, pii &b) {return a.second < b.second;} //asc
int ys[] = {-1, -1, 0, 1, 1, 1, 0, -1}; //edges [0, 2, 4, 6]
int xs[] = {0, 1, 1, 1, 0, -1, -1, -1};
//-----------------------------------------------------------------------------//
//const int N = ?e5 + 5;
int n, k,ans=2e9, kk;
vector<vpii> g;
vi a;
string s;
int w=0;
struct B_CH_SACK {
int n, timer = 0;
vector<int> sz, b_ch;
vector<int> order, tin, tout;
map<int, int> freq;
vi to,depth;
B_CH_SACK(int _n = 0) {
n = _n;
if (n) {
freq[0]=0;
to.resize(n, 0);
depth.resize(n, 0);
sz.resize(n, 1);
b_ch.resize(n, -1);
tin.resize(n);
tout.resize(n);
dfs(0, -1);
solve(0, -1, false);
}
}
void dfs(int u, int p, int here=0,int lev=0) {
tin[u] = timer++;
order.push_back(u);
to[u]=here;
depth[u]=lev;
int mx = 0, idx = -1;
for (int i = 0; i < g[u].size(); ++i) {
int v=g[u][i].f;
int c=g[u][i].s;
if (v == p) continue;
dfs(v, u,here+c,lev+1);
sz[u] += sz[v];
if (sz[v] > mx) {
mx = sz[v];
idx = v;
}
}
b_ch[u] = idx;
tout[u] = timer-1;
}
void solve(int u, int p, bool keep) {
int cpy=-1;
for (int i = 0; i < g[u].size(); ++i) {
int v=g[u][i].f;
int c=g[u][i].s;
if (v == b_ch[u])cpy=c;
if (v == p || v == b_ch[u]) continue;
solve(v, u, false);
}
if (b_ch[u] != -1) {
solve(b_ch[u], u, true);
w++;
int dif=k-cpy;
if (freq.count(dif))
ans=min(ans,w+freq[dif]);
}
dbg(u, keep, freq);
for (int j = 0; j< g[u].size(); ++j) {
int v=g[u][j].f;
int c=g[u][j].s;
if (v == p || v == b_ch[u]) continue;
for (int i = tin[v]; i <= tout[v]; i++) {
int x = order[i];
int t=to[i]-to[u]-cpy;
int dif=k-t-(2*cpy);
if (freq.count(dif))
ans=min(ans,depth[i]-depth[u]+freq[dif]+w);
freq[t] = min(freq[t],depth[i]-depth[u]-1);
}
}
dbg(u, keep, freq);
if (!keep) {
freq.clear();
freq[0]=0;
k = kk;
w=0;
}
else{
if (~cpy)
k -= cpy;
}
}
} sack;
int best_path(int N, int K, int H[][2], int L[]){
n=N;
k=kk=K;
g = vector<vpii>(n);
for (int i = 0; i < n-1; ++i) {
int u,v;
u=H[i][0], v=H[i][1];
g[u].pb({v,L[i]});
g[v].pb({u,L[i]});
}
dbg(g);
sack=B_CH_SACK(n);
if (ans > 1e7)
return -1;
return ans;
}