Submission #253193

#TimeUsernameProblemLanguageResultExecution timeMemory
253193aviroop123Cat in a tree (BOI17_catinatree)C++14
51 / 100
17 ms9472 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 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[u] + sz[v]) { dp1[i] = 0; } for(int i = 0; i <= sz[u]; i++) { // take something from u and v for(int j = 0; j <= sz[v]; j++) { if(i + j + 1 < d) continue; int k = min(i, j + 1); dp1[k] = max(dp1[k], 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[u]) { dp[u][i] = max(dp[u][i], dp1[i]); } } } } void solve() { sc(n, d); fr(i, 2, n) { int p; sc(p); p++; g[i].pb(p); g[p].pb(i); debug(i, p); } 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; }

Compilation message (stderr)

catinatree.cpp: In function 'void solve()':
catinatree.cpp:158:20: warning: statement has no effect [-Wunused-value]
         debug(i, p);
                    ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...