結果
| 問題 |
No.3283 Labyrinth and Friends
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-09-26 22:07:38 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 14 ms / 2,000 ms |
| コード長 | 2,447 bytes |
| コンパイル時間 | 7,258 ms |
| コンパイル使用メモリ | 356,868 KB |
| 実行使用メモリ | 7,716 KB |
| 最終ジャッジ日時 | 2025-09-26 22:07:47 |
| 合計ジャッジ時間 | 9,483 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 45 |
ソースコード
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#include <stdlib.h>
#include <atcoder/all>
using namespace atcoder;
using namespace std;
#define rep(i, a, n) for(ll i = a; i < n; i++)
#define rrep(i, a, n) for(ll i = a; i >= n; i--)
#define inr(l, x, r) (l <= x && x < r)
#define ll long long
#define ld long double
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(x) (x).begin(), (x).end()
//constexpr ll MOD = 1000000007;
constexpr ll MOD = 998244353;
constexpr int IINF = 1001001001;
constexpr ll INF = 1LL<<60;
template<class t,class u> void chmax(t&a,u b){if(a<b)a=b;}
template<class t,class u> void chmin(t&a,u b){if(b<a)a=b;}
using mint = modint998244353;
ll gcd(ll a, ll b){
if(a%b == 0){
return b;
}else{
return gcd(b, a%b);
}
}
ll lcm(ll a, ll b){
return a*b / gcd(a, b);
}
ll powMod(ll x, ll n, ll mod) {
if (n == 0) return 1 % mod;
ll val = powMod(x, n / 2, mod);
val *= val;
val %= mod;
if (n % 2 == 1) val *= x;
return val % mod;
}
int main() {
ll n, x; cin >> n >> x;
vector<ll> p(n), c(n,0), s(n,0);
ll sum = 0, sum2 = 0;
vector<vector<ll>> g(n);
rep(i,1,n) cin >> p[i], p[i]--;
rep(i,1,n) g[p[i]].push_back(i);
rep(i,1,n) cin >> c[i] >> s[i], sum += s[i], sum2 += c[i];
ll px = sum-x+1;
vector<vector<ll>> dp(n);
auto dfs = [&](auto& self, int v) -> pll {
vector<ll> use = {0};
pll ss = {c[v], s[v]};
for(auto nv : g[v]){
auto [nc, ns] = self(self, nv);
ss.first += nc;
ss.second += ns;
vector<ll> nuse(min((ll)(use.size()+dp[nv].size()-1),px+1), -INF);
rep(i,0,use.size()) rep(j,0,dp[nv].size()){
if(i + j > px) break;
chmax(nuse[i+j], use[i] + dp[nv][j]);
}
use = nuse;
}
chmin(ss.second,px);
while(ss.second >= use.size()) use.push_back(-INF);
use[ss.second] = max(use[ss.second], ss.first);
dp[v] = use;
return ss;
};
dfs(dfs,0);
ll ans = INF;
rep(i,0,dp[0].size()){
if(i < px && dp[0][i] >= 0) chmin(ans, sum2 - dp[0][i]);
// cout << px << " " << i << " " << dp[0][i] << " " << sum2 - dp[0][i] << endl;
}
// rep(i,0,n){
// for(auto xx: dp[i]) cout << xx << " ";
// cout << endl;
// }
cout << ans << endl;
return 0;
}