Submission #1453861
Source Code Expand
#include <algorithm>
#include <cassert>
#include <cstdio>
#include <functional>
#include <tuple>
#include <vector>
#define repeat(i, n) for (int i = 0; (i) < int(n); ++(i))
#define whole(f, x, ...) ([&](decltype((x)) whole) { return (f)(begin(whole), end(whole), ## __VA_ARGS__); })(x)
using ll = long long;
using namespace std;
template <class T> inline void setmin(T & a, T const & b) { a = min(a, b); }
template <typename UnaryPredicate>
ll binsearch(ll l, ll r, UnaryPredicate p) { // [l, r), p is monotone
assert (l < r);
-- l;
while (r - l > 1) {
ll m = (l + r) / 2;
(p(m) ? r : l) = m;
}
return r; // = min { x in [l, r) | p(x) }, or r
}
bool pred(vector<vector<pair<int, int> > > const & g, ll limit) {
function<vector<pair<ll, ll> > (int, int)> dfs = [&](int v, int parent) {
if (g[v].size() == 1) {
vector<pair<ll, ll> > result;
result.emplace_back(0, 0);
return result;
}
vector<pair<ll, ll> > left, right;
for (auto edge : g[v]) {
int w, value; tie(w, value) = edge;
if (w == parent) continue;
auto & it = (left.empty() ? left : right);
it = dfs(w, v);
repeat (i, it.size()) {
it[i].first += value;
it[i].second += value;
}
}
vector<pair<ll, ll> > result;
auto func = [&]() {
int i = 0;
int j = right.size() - 1;
while (i < left.size()) {
while (j >= 0 and left[i].second + right[j].first > limit) -- j;
if (j < 0) break;
ll a = left[i].first;
ll b = right[j].second;
if (a > b) swap(a, b);
result.emplace_back(a, b);
++ i;
}
};
auto flip = [](vector<pair<ll, ll> > & it) {
repeat (i, it.size()) swap(it[i].first, it[i].second);
whole(reverse, it);
};
func(); left.swap(right);
func(); left.swap(right);
flip(left);
func(); left.swap(right);
func(); left.swap(right);
flip(right);
func(); left.swap(right);
func(); left.swap(right);
flip(left);
func(); left.swap(right);
func(); left.swap(right);
whole(sort, result);
result.erase(whole(unique, result, [&](auto x, auto y) { return x.second <= y.second; }), result.end());
return result;
};
return not dfs(0, -1).empty();
}
constexpr ll inf = ll(1e18)+9;
int main() {
int n; scanf("%d", &n);
vector<vector<pair<int, int> > > g(n);
repeat (i, n - 1) {
int a, v; scanf("%d%d", &a, &v);
g[a - 1].emplace_back(i + 1, v);
g[i + 1].emplace_back(a - 1, v);
}
ll result = binsearch(0, inf, [&](ll limit) {
return pred(g, limit);
});
printf("%lld\n", result);
return 0;
}
Submission Info
Submission Time |
|
Task |
E - Shik and Travel |
User |
kimiyuki |
Language |
C++14 (Clang 3.8.0) |
Score |
0 |
Code Size |
3049 Byte |
Status |
WA |
Exec Time |
1739 ms |
Memory |
35072 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
0 / 1400 |
Status |
|
|
Set Name |
Test Cases |
Sample |
example0.txt, example1.txt, example2.txt, example3.txt |
All |
000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, 037.txt, 038.txt, 039.txt, 040.txt, 041.txt, 042.txt, 043.txt, 044.txt, 045.txt, 046.txt, 047.txt, 048.txt, 049.txt, example0.txt, example1.txt, example2.txt, example3.txt |
Case Name |
Status |
Exec Time |
Memory |
000.txt |
AC |
25 ms |
384 KB |
001.txt |
AC |
25 ms |
384 KB |
002.txt |
AC |
25 ms |
384 KB |
003.txt |
AC |
26 ms |
384 KB |
004.txt |
AC |
25 ms |
384 KB |
005.txt |
AC |
25 ms |
384 KB |
006.txt |
AC |
26 ms |
384 KB |
007.txt |
AC |
26 ms |
384 KB |
008.txt |
AC |
25 ms |
384 KB |
009.txt |
AC |
25 ms |
384 KB |
010.txt |
AC |
1692 ms |
8448 KB |
011.txt |
AC |
1696 ms |
8448 KB |
012.txt |
AC |
1637 ms |
8448 KB |
013.txt |
AC |
1662 ms |
8448 KB |
014.txt |
AC |
1628 ms |
8448 KB |
015.txt |
AC |
1591 ms |
8448 KB |
016.txt |
AC |
1614 ms |
8448 KB |
017.txt |
AC |
1667 ms |
8448 KB |
018.txt |
AC |
1622 ms |
8448 KB |
019.txt |
AC |
1632 ms |
10496 KB |
020.txt |
AC |
1602 ms |
8448 KB |
021.txt |
WA |
1610 ms |
8448 KB |
022.txt |
AC |
1632 ms |
8448 KB |
023.txt |
AC |
1680 ms |
8448 KB |
024.txt |
AC |
1672 ms |
8448 KB |
025.txt |
AC |
1573 ms |
8448 KB |
026.txt |
AC |
1621 ms |
8448 KB |
027.txt |
AC |
1595 ms |
8448 KB |
028.txt |
AC |
1564 ms |
8448 KB |
029.txt |
AC |
1575 ms |
8448 KB |
030.txt |
AC |
1491 ms |
8448 KB |
031.txt |
AC |
1573 ms |
8448 KB |
032.txt |
AC |
1536 ms |
8448 KB |
033.txt |
AC |
1561 ms |
10496 KB |
034.txt |
AC |
1555 ms |
8448 KB |
035.txt |
AC |
1549 ms |
8448 KB |
036.txt |
AC |
1583 ms |
8448 KB |
037.txt |
AC |
1505 ms |
8448 KB |
038.txt |
AC |
1551 ms |
8448 KB |
039.txt |
AC |
1438 ms |
8448 KB |
040.txt |
AC |
1395 ms |
8448 KB |
041.txt |
AC |
1514 ms |
8448 KB |
042.txt |
AC |
1522 ms |
8448 KB |
043.txt |
AC |
1521 ms |
8448 KB |
044.txt |
AC |
1317 ms |
35072 KB |
045.txt |
AC |
1503 ms |
21760 KB |
046.txt |
AC |
1596 ms |
25700 KB |
047.txt |
AC |
1739 ms |
22960 KB |
048.txt |
AC |
1521 ms |
30848 KB |
049.txt |
AC |
1 ms |
256 KB |
example0.txt |
AC |
1 ms |
256 KB |
example1.txt |
AC |
1 ms |
256 KB |
example2.txt |
AC |
1 ms |
256 KB |
example3.txt |
AC |
1 ms |
256 KB |