QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#55021#1271. In Search of GoldYaoBIG#TL 2ms3760kbC++2.4kb2022-10-11 22:33:312022-10-11 22:33:33

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-10-11 22:33:33]
  • 评测
  • 测评结果:TL
  • 用时:2ms
  • 内存:3760kb
  • [2022-10-11 22:33:31]
  • 提交

answer

#include "bits/stdc++.h"
#define rep(i, a, n) for (auto i = a; i <= (n); i++)
#define revrep(i, a, n) for (auto i = n; i >= (a); i--)
#define all(a) a.begin(), a.end()
#define sz(a) (int)(a).size()
template<class T> bool chmin(T &a, T b) { if (a > b) { a = b; return 1; } else return 0; }
template<class T> bool chmax(T &a, T b) { if (a < b) { a = b; return 1; } else return 0; }
using namespace std;

template<class A, class B> string to_string(pair<A, B> p);
template<class A> string to_string(A v) {
	bool first = 1;
	string res = "{";
	for (auto x: v) {
		if (!first) res += ", ";
		first = 0;
		res += to_string(x);
	}
	res += "}";
	return res;
}
template<class A, class B> string to_string(pair<A, B> p) {
	return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

void debug_out() { cerr << endl; }
template<class H, class... T> void debug_out(H h, T... t) {
	cerr << " " << to_string(h);
	debug_out(t...);
}

#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)

using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;



int main() {
	ios::sync_with_stdio(0); cin.tie(0);

	int cas; cin >> cas; while (cas--) {
		int n, k; cin >> n >> k;
		vector<vector<tuple<int, int, int>>> g(n);
		rep(i, 1, n - 1) {
			int u, v, a, b; cin >> u >> v >> a >> b;
			u--, v--;
			g[u].emplace_back(v, a, b);
			g[v].emplace_back(u, a, b);
		}

		auto check = [&](ll guess) {
			static vector<vector<ll>> dp;
			dp.resize(n);
			
			auto dfs = [&](auto &dfs, int now, int fa) -> void {
				auto &cur = dp[now];
				cur.assign(1, 0ll);
				for (auto [v, a, b]: g[now]) if (v != fa) {
					dfs(dfs, v, now);
					auto &sondp = dp[v];
					vector<ll> ndp(min(sz(dp) + sz(sondp), k + 1), 1ll << 60);
					rep(i, 0, sz(dp) - 1) {
						rep(j, 0, sz(sondp) - 1) {
							if (i + j > k) break;
							if (cur[i] + sondp[j] + b <= guess) chmin(ndp[i + j], max(cur[i], sondp[j] + b));
							if (i + j + 1 <= k && cur[i] + sondp[j] + a <= guess) chmin(ndp[i + j + 1], max(cur[i], sondp[j] + a));
						}
					}
					swap(cur, ndp);
				}
			};
			dfs(dfs, 0, -1);
			return dp[0][k] != 1ll << 60;
		};
		
		ll lo = 0, hi = 1ll * (n - 1) * (ll)(1e9 + 1);
		while (lo < hi) {
			ll mid = (lo + hi) >> 1;
			if (check(mid)) hi = mid;
			else lo = mid + 1;
		}
		printf("%lld\n", hi);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 3760kb

input:

1
4 1
1 2 1 3
2 3 4 2
2 4 3 5

output:

6

result:

ok single line: '6'

Test #2:

score: -100
Time Limit Exceeded

input:

1118
10 5
1 2 557878805 99156035
2 3 170460737 198842212
3 4 473592718 245654078
4 5 774731915 3786984
1 6 817584282 305447690
1 7 308601560 633840726
3 8 718662215 102379861
3 9 26761157 849561804
6 10 617758160 117754666
10 6
1 2 952221943 224077095
2 3 101056818 462900286
3 4 760307950 560511059
...

output:

942260190
3732632654
2451798440
2087923068
3307453190
4490065261
2393372595
2816978868
2555185013
2411463895
2137224462
1582942446
1213751604
1924820637
2018214075
2362339230
3014059043
2262889657
2303205388
2110653290
3081993716
2849219294
1733366442
2021128541
2303200787
3420317049
2870883724
3104...

result: