結果
問題 |
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; }