Submission #253201

#TimeUsernameProblemLanguageResultExecution timeMemory
253201aviroop123Cat in a tree (BOI17_catinatree)C++14
0 / 100
1 ms384 KiB
// #pragma comment(linker, "/stack:200000000") // #pragma GCC optimize("Ofast") // #pragma GCC optimize ("unroll-loops") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") // codeforces //#pragma GCC target("avx,avx2,fma") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native") // yandex #include "bits/stdc++.h" using namespace std; #ifndef LOCAL #define endl '\n' #endif #define fr(i, a, b) for(int i = a; i <= b; i++) #define rf(i, a, b) for(int i = a; i >= b; i--) #define pf push_front #define pb push_back #define eb emplace_back #define fi first #define se second #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define sz(x) (int)x.size() #define lb lower_bound #define ub upper_bound typedef long long ll; typedef long double f80; typedef pair<int,int> pii; typedef pair<ll,ll> pll; int pct(int x) { return __builtin_popcount(x); } int pct(ll x) { return __builtin_popcountll(x); } int bt(int x) { return 31 - __builtin_clz(x); } // floor(log2(x)) int bt(ll x) { return 63 - __builtin_clzll(x); } // floor(log2(x)) int cdiv(int a, int b) { return a / b + !(a < 0 || a % b == 0); } ll cdiv(ll a, ll b) { return a / b + !(a < 0 || a % b == 0); } int nxt_C(int x) { int c = x & -x, r = x + c; return (((r ^ x) >> 2) / c) | r; } ll nxt_C(ll x) { ll c = x & -x, r = x + c; return (((r ^ x) >> 2) / c) | r; } vector<int> get_bits(int mask) { vector<int> bb; while(mask) { int b = bt(mask); bb.pb(b); mask ^= (1 << b); } reverse(all(bb)); return bb; } int get_mask(vector<int> v) { int mask = 0; for(int x : v) { mask ^= (1 << x); } return mask; } template<typename T> void uniq(vector<T> &v) { sort(all(v)); v.resize(unique(all(v)) - v.begin()); } mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); ll rand(ll l, ll r){ uniform_int_distribution<ll> uid(l, r); return uid(rng); } void sc() {} template <typename Head, typename... Tail> void sc(Head &H, Tail &... T) { cin >> H; sc(T...); } #ifdef LOCAL #define debug(...) cerr << "[L:" << __LINE__ << "][" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__) #else #define debug(...) 42 #endif // #ifndef LOCAL // string to_string(__int128 x) { // string s = ""; // bool neg = 0; // if(x < 0) { s += "-"; neg = 1; x = -x; } // if(!x) s += '0'; // while(x) { // int rem = x % 10; // s += to_string(rem); // x /= 10; // } // reverse(s.begin() + neg, s.end()); // return s; // } // #endif const int mod = 1e9 + 7; // 998244353; int pwr(int a,ll b) { int ans = 1; while(b) { if(b & 1) ans = (ans * 1LL * a) % mod; a = (a * 1LL * a) % mod; b >>= 1; } return ans; } /* Lookout for overflows!! Check array sizes!! Clear before test cases!! Use the correct modulo!! Check for corner cases!! Are you forgetting something?! Read problem statement carefully!!! */ const int N = 1505; int dp[N][N]; int sz[N]; int dp1[N]; int n, d; vector<int> g[N]; void pre(int u,int p) { sz[u] = 1; vector<pii> nv; for(int v : g[u]) { if(v != p) { pre(v, u); nv.pb({sz[v], v}); } } sort(all(nv)); reverse(all(nv)); g[u].clear(); for(auto x : nv) { g[u].pb(x.se); } } void dfs(int u,int p) { sz[u] = 1; fr(i, 0, n) { dp[u][i] = 0; } dp[u][0] = 1; for(int v : g[u]) { if(v != p) { dfs(v, u); fr(i, 0, sz[v] + 1) { dp1[i] = 0; } // take something from u and v // for(int j = 0; j <= sz[v]; j++) { // for(int i = max(0, d - j - 1); i <= sz[u]; i++) { // int k = min(i, j + 1); // dp1[k] = max(dp1[k], dp[u][i] + dp[v][j]); // } // } for(int i = 0; i <= sz[v] + 1; i++) { int j = d - i - 1; if(j <= sz[v] && j >= 0) { dp1[min(i, j + 1)] = max(dp1[min(i, j + 1)], dp[u][i] + dp[v][j]); } } for(int j = 0; j <= sz[v]; j++) { int i = d - (j + 1); if(i <= sz[u] && i >= 0) { dp1[min(i, j + 1)] = max(dp1[min(i, j + 1)], dp[u][i] + dp[v][j]); } } fr(i, 0, sz[v]) { // take everything from v dp1[i + 1] = max(dp1[i + 1], dp[v][i]); } sz[u] += sz[v]; fr(i, 0, sz[v] + 1) { dp[u][i] = max(dp[u][i], dp1[i]); dp[u][i] = max(dp[u][i], dp[u][i + 1]); } } } } void solve() { sc(n, d); fr(i, 2, n) { int p; sc(p); p++; g[i].pb(p); g[p].pb(i); } pre(1, 0); dfs(1, 0); int ans = 0; fr(i, 0, n) { ans = max(ans, dp[1][i]); } cout << ans; } int main() { ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; // cin >> t; for(int tt = 1; tt <= t; tt++) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...