Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define FILE_INPUT
- #define _CRT_SECURE_NO_WARNINGS
- // _
- // (_)
- // _ __ ___ __ _ _ ___ _ __ _ __ ___
- //| '_ ` _ \ / _` | |/ _ \| '__| '__/ _ \
- //| | | | | | (_| | | (_) | | | | | (_) |
- //|_| |_| |_|\__,_| |\___/|_| |_| \___/
- // _/ |
- // |__/
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef double dbl;
- typedef long double ldbl;
- typedef pair<int, int> pii;
- typedef pair<ll, ll> pll;
- typedef string str;
- typedef vector<int> vi;
- typedef vector<ll> vll;
- typedef vector<bool> vbl;
- #define majorro cout.precision(20); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #define pb push_back
- #define forn(i, n) for(ll (i) = 0; (i) < (n); ++(i))
- #define fornm(i, m, n) for(ll (i) = (m); (i) < (n); ++(i))
- #define rfornm(i, m, n) for(ll (i) = (m); (i) >= (n); --(i))
- #define readvec(vector, n) {ll temp_vec_val;forn(i, n){cin >> temp_vec_val;vector.push_back(temp_vec_val);}}
- #define printvec(vector, delimeter) {ll length_of_vector=vector.size();\
- forn(elementvec, length_of_vector){cout << vector[elementvec] << delimeter;}}
- #define printarr(arr, length, delimeter) {forn(elementarr, length){cout << arr[elementarr] << delimeter;}}
- #define sortvec(vector) sort(vector.begin(), vector.end())
- #define rsortvec(vector) sort(vector.rbegin(), vector.rend())
- struct pair_hash
- {
- template <class T1, class T2>
- std::size_t operator() (const std::pair<T1, T2>& pair) const
- {
- return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
- }
- };
- ll digit_sum(ll num)
- {
- ll dig_sum = 0;
- while(num > 0)
- {
- dig_sum += num % 10;
- num /= 10;
- }
- return dig_sum;
- }
- const ldbl EPS = 0.000001;
- const ll MOD = 1000000007;
- // const ll MOD = 3037000499;
- // const ull MOD = 1000000000000000003;
- const ll INF = 1e18;
- const double pi = 2 * acos(0.0);
- ll n, m, k, p, q, t, sum = 0, cnt= 0;
- ll mx = INT64_MIN;
- ll mn = INT64_MAX;
- bool flag = 0;
- vll v;
- str s = "", s1, s2;
- void bad_solve(){}
- ll findnum(vll& vv, ll num)
- {
- ll l = 0, r = n-1;
- while(l < r)
- {
- ll mid = (l+r)/2;
- if(vv[mid] == num) return mid;
- if(vv[mid] < num) l = mid+1;
- else r = mid;
- }
- return l;
- }
- bool used[(ll)3e5+1] = {0};
- vll ans;
- vector<vll> g;
- void dfs(ll vt, ll dpt)
- {
- used[vt] = 1;
- bool fl = 0;
- for(auto u : g[vt])
- {
- if(!used[u])
- {
- dfs(u, dpt+1);
- fl = 1;
- }
- }
- if(!fl)
- {
- ans.pb(dpt);
- return;
- }
- }
- ll dfs2(ll vt, ll dpt)
- {
- if(!vt)
- {
- return dpt;
- }
- for(auto u : g[vt])
- {
- return dfs2(u, dpt+1);
- }
- return 228;
- }
- void solve() //set.merge() -> c++17
- //DELET DEBUG OUTPUT!11!1
- //1+2+3+...+n == (n*(n+1))/2
- //"YES" OUTPUT!!!!
- //__builtin_popcountll() -> __popcnt64() from <intrin.h>
- {
- cin >> n >> k;
- g.resize(n);
- pair<bool, ll> lfs[n] = {{0,0}};
- fornm(i ,1, n)
- {
- cin >> p;
- --p;
- g[i].pb(p);
- lfs[p].first = 1;
- lfs[i].second = lfs[p].second+1;
- }
- vector<pll> vv;
- forn(i, n)
- {
- if(!lfs[i].first) vv.pb({lfs[i].second, i});
- }
- m = vv.size();
- rsortvec(vv);
- forn(i, m)
- {
- ll u = vv[i].second;
- dfs(u, 1);
- }
- rsortvec(ans);
- forn(i, min(k, (ll)ans.size()))
- {
- sum += ans[i];
- }
- cout << sum;
- }
- int main()
- {
- #ifdef FILE_INPUT
- freopen("F:\\repos\\projects\\contests_vsc\\in.txt", "r", stdin);
- freopen("F:\\repos\\projects\\contests_vsc\\out.txt", "w", stdout);
- #endif
- majorro
- solve();
- // freopen("test.txt", "w", stdout);
- // bad_solve();
- // memset(v, INT_MAX, 1000*2000*sizeof(int));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement