Submission #1692067


Source Code Expand

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>

using namespace std;

const int MAXN = 200000 + 100;
const long long INF = 0x1f1f1f1f1f1f1f1fll;

typedef pair<int, int> pii;
typedef vector<pii> vpii;

int n;
vector<int> son[MAXN], wei[MAXN];
vector<pair<int, int> > list[MAXN];
long long f[MAXN];

void merge(const vpii &a, const vpii &b, vpii &c)
{
	// int l = 0, r = 0;
	// while(l < a.size() && r < b.size())
	// 	if(a[l] < b[r])
	// 		c.push_back(a[l]), l++;
	// 	else
	// 		c.push_back(b[r]), r++;
	// while(l < a.size())
	// 	c.push_back(a[l]), l++;
	// while(r < b.size())
	// 	c.push_back(b[r]), r++;
	int l = a.size() - 1, r = b.size() - 1;
	while(~l && ~r)
		if(a[l] < b[r])
			c.push_back(a[l]), l--;
		else
			c.push_back(b[r]), r--;
	while(~l)
		c.push_back(a[l]), l--;
	while(~r)
		c.push_back(b[r]), r--;
}

void arange(vpii &a)
{
	if(!a.size()) return ;
	int p = 0;
	a[p] = a[0], p++;
	for(int i = 1; i < a.size(); i++)
		if(!(a[i - 1].first <= a[i].first && a[i - 1].second <= a[i].second))
			a[p] = a[i], p++;
	a.resize(p);
}

void print(vpii &a)
{
	for(int i = 0; i < a.size(); i++)
		cout << a[i].first << ' ' << a[i].second << " / ";
	cout << endl;
}

bool dfs(int x, int fa, long long k)
{
	// cout << k << " : " << x << endl;
	if(son[x].size() == 0)
	{
		list[x].push_back(make_pair(0, 0));
		return true;
	}
	int s0 = son[x][0], s1 = son[x][1], w0 = wei[x][0], w1 = wei[x][1];
	if(!dfs(s0, x, k) || !dfs(s1, x, k)) return false;
	// for(int i = 0; i < 2; i++)
	// 	for(int j = 0; j < list[son[x][i]].size(); j++)
	// 		list[son[x][i]][j] = make_pair(list[son[x][i]][j].first + wei[x][i], list[son[x][i]][j].second + wei[x][i]);
	if(list[s0].size() > list[s1].size()) swap(s0, s1), swap(w0, w1);
	static vector<pair<int, int> > arr0, arr1;
	arr0.clear(), arr1.clear();
	int r = list[s1].size() - 1, l = 0;
	for(int i = list[s0].size() - 1; i >= 0; i--)
	{
		while(r >= 0 && list[s0][i].second + list[s1][r].first + w0 + w1 > k) r--;
		while(l < list[s1].size() && list[s0][i].second + list[s1][l].second + w0 + w1 > k) l++;
		if(r >= 0 && l < list[s1].size())
			arr0.push_back(make_pair(list[s0][i].first + w0, min(list[s1][r].second, list[s1][l].first) + w1));
		else if(r >= 0)
			arr0.push_back(make_pair(list[s0][i].first + w0, list[s1][r].second + w1));
		else if(l < list[s1].size())
			arr0.push_back(make_pair(list[s0][i].first + w0, list[s1][l].first + w1));
	}
	r = list[s1].size() - 1, l = 0;
	for(int i = 0; i < list[s0].size(); i++)
	{
		while(r >= 0 && list[s0][i].first + list[s1][r].first + w0 + w1 > k) r--;
		while(l < list[s1].size() && list[s0][i].first + list[s1][l].second + w0 + w1 > k) l++;
		if(r >= 0 && l < list[s1].size())
			arr1.push_back(make_pair(list[s0][i].second + w0, min(list[s1][r].second, list[s1][l].first) + w1));
		else if(r >= 0)
			arr1.push_back(make_pair(list[s0][i].second + w0, list[s1][r].second + w1));
		else if(l < list[s1].size())
			arr1.push_back(make_pair(list[s0][i].second + w0, list[s1][l].first + w1));
	}
	// cout << x << ' ' << arr0.size() << ' ' << arr1.size() << endl;
	// for(int i = 0; i < arr0.size(); i++)
	// 	cout << arr0[i].first << ' ' << arr0[i].second << endl;
	// for(int i = 0; i < arr1.size(); i++)
	// 	cout << arr1[i].first << ' ' << arr1[i].second << endl;
	if(arr0.size() + arr1.size() == 0)
		return false;
	// reverse(arr0.begin(), arr0.end());
	// reverse(arr1.begin(), arr1.end());

	// cout << x << endl, print(arr0), , print(arr0);
	// cout << endl;
	// arange(arr0);
	// arange(arr1);
	merge(arr0, arr1, list[x]);
	// arange(list[x]);

	// cout << x << " : ", print(list[x]);

	return true;
}

bool calc(long long k)
{
	for(int i = 1; i <= n; i++)
		list[i].clear();
	return dfs(1, 0, k);
}

void solve()
{
	long long l = 0, r = 10000000000ll, ans = 0;
	while(l < r)
	{
		long long mid = (l + r) / 2;
		if(calc(mid))
			r = mid, ans = mid;
		else
			l = mid + 1;
	}
	cout << ans << endl;
}

int main()
{
	ios::sync_with_stdio(false);
	// freopen("travel.in", "r", stdin);
	// freopen("travel.out", "w", stdout);

	cin >> n;
	for(int i = 2; i <= n; i++)
	{
		int x, z;
		cin >> x >> z;
		son[x].push_back(i), wei[x].push_back(z);
	}

	solve();

	return 0;
}

Submission Info

Submission Time
Task E - Shik and Travel
User ct123098
Language C++14 (GCC 5.4.1)
Score 0
Code Size 4455 Byte
Status WA
Exec Time 739 ms
Memory 31744 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 1400
Status
AC × 4
AC × 44
WA × 10
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 9 ms 14464 KB
001.txt AC 9 ms 14464 KB
002.txt AC 9 ms 14464 KB
003.txt AC 9 ms 14464 KB
004.txt AC 9 ms 14464 KB
005.txt AC 9 ms 14464 KB
006.txt AC 9 ms 14464 KB
007.txt AC 9 ms 14464 KB
008.txt WA 9 ms 14464 KB
009.txt AC 9 ms 14464 KB
010.txt AC 258 ms 23168 KB
011.txt WA 248 ms 23168 KB
012.txt AC 269 ms 23168 KB
013.txt WA 270 ms 23168 KB
014.txt AC 229 ms 23168 KB
015.txt AC 266 ms 23168 KB
016.txt AC 271 ms 23168 KB
017.txt AC 272 ms 23168 KB
018.txt AC 272 ms 23168 KB
019.txt AC 252 ms 23168 KB
020.txt WA 269 ms 23168 KB
021.txt AC 264 ms 23168 KB
022.txt AC 244 ms 23168 KB
023.txt WA 259 ms 23168 KB
024.txt WA 257 ms 23168 KB
025.txt AC 222 ms 23168 KB
026.txt AC 238 ms 23168 KB
027.txt AC 248 ms 23168 KB
028.txt AC 266 ms 23168 KB
029.txt AC 236 ms 23168 KB
030.txt AC 609 ms 30576 KB
031.txt AC 705 ms 30576 KB
032.txt AC 739 ms 30580 KB
033.txt AC 576 ms 30580 KB
034.txt WA 619 ms 30576 KB
035.txt AC 711 ms 30580 KB
036.txt AC 595 ms 30580 KB
037.txt AC 616 ms 30576 KB
038.txt AC 594 ms 30580 KB
039.txt AC 738 ms 30580 KB
040.txt AC 429 ms 30580 KB
041.txt AC 538 ms 30576 KB
042.txt AC 548 ms 30576 KB
043.txt AC 531 ms 30580 KB
044.txt AC 186 ms 31744 KB
045.txt AC 191 ms 27136 KB
046.txt WA 169 ms 28544 KB
047.txt WA 169 ms 27520 KB
048.txt WA 184 ms 30336 KB
049.txt AC 6 ms 14336 KB
example0.txt AC 6 ms 14336 KB
example1.txt AC 6 ms 14336 KB
example2.txt AC 6 ms 14336 KB
example3.txt AC 6 ms 14336 KB