Submission #43506283


Source Code Expand

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define op(x) ((x&1)?x+1:x-1)
#define odd(x) (x&1)
#define even(x) (!odd(x))
#define lc(x) (x<<1)
#define rc(x) (lc(x)|1)
#define lowbit(x) (x&-x)
#define mp(x,y) make_pair(x,y)
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
using namespace std;
const int MAXN = 2e5+10;

typedef vector<int> vec;

int n;
vec e[MAXN],S1,S2;

int fa[MAXN],dep[MAXN],tag[MAXN],rcnt[MAXN],cnt[MAXN],ans;

int vis[MAXN];

void dfs(int u){
	for(auto v:e[u])if(v!=fa[u]){
		dep[v]=dep[u]^1;
		dfs(v);
		cnt[u]++;
	}
	rcnt[u] = cnt[u];
}

struct DSU{
	int p[MAXN];
	void init(){
		iota(p+1,p+1+n,1);
	}
	int find(int x){
		return (x == p[x]) ? (x) : (p[x] = find(p[x]));
	}
	void rst(int x,int md=0){
		if(md)p[x] = find(fa[x]);
		else p[x] = find(fa[fa[x]]);
	}
}dsu;

set<int>son[MAXN];

int sz[MAXN],dfn[MAXN],dtot;

struct BIT{
	int t[MAXN];
	void mdf(int x,int v){
		for(;x<=dtot;x+=lowbit(x))t[x] += v;
	}
	int qry(int x,int S=0){
		for(;x;x-=lowbit(x))S+=t[x];
		return S;
	}
}bit,bit2;
int qry(int x){
	if(x==0)return bit.qry(dtot);

	return bit.qry(dfn[x] + sz[x]-1) - bit.qry(dfn[x]-1);
}
int qry2(int x){
	if(x==0)return bit2.qry(dtot);

	return bit2.qry(dfn[x] + sz[x]-1) - bit2.qry(dfn[x]-1);
}

vector<int>tmp;

void dfs2(int u){
	sz[u]=1;
	dfn[u] = ++dtot;
	for(auto v:e[u])if(v!=fa[u] && !vis[v])dfs2(v),sz[u]+=sz[v],son[u].insert(v);
}

struct comp{
	bool operator()(int x,int y)const{
		return (sz[x] != sz[y]) ? (sz[x] < sz[y]) : (x < y);
	}
};
set<int,comp>S;

int ban[MAXN];

int main(){
	ios::sync_with_stdio(false);

	cin>>n;
	rep(i,2,n){
		cin>>fa[i];
		e[fa[i]].push_back(i);
	}

	dfs(1);

	rep(i,1,n)if(!rcnt[i]){
		if(!dep[i])S1.push_back(i);
		else{
			cnt[fa[i]]--;
			if(cnt[fa[i]])S2.push_back(i);
		}
	}

	int t = 0;
	for(;S1.size() || S2.size();t^=1){
		if(S1.size()){
			int u = S1.back();S1.pop_back();vis[u]=1;	
			ans += (!t);
			int p = fa[u];
			cnt[p]--;
			if(!cnt[p]){
				cnt[fa[p]]--;
				if(cnt[fa[p]])S2.push_back(p);
			}
		}else{
			int u = S2.back();S2.pop_back();vis[u]=1;
			ans += t;
		}
	}

	if(vis[1]){
		cout<<ans<<endl;
		exit(0);
	}


	int num = 0;
	rep(i,1,n)if(!vis[i])num++;

	//
	dfs2(1);sz[0] = sz[1];

	dsu.init();
	rep(i,1,n)if(!vis[i] && !dep[i] && son[i].size() == 1)dsu.rst(i,1);

	rep(i,1,n)if(!vis[i] && dep[i] && son[fa[i]].size() == 1)dsu.rst(i);

	rep(i,1,n)if(son[i].empty() && !vis[i]){
		tmp.push_back(dsu.find(i));
	}
	sort(tmp.begin(),tmp.end(),[&](int x,int y){return dfn[x] > dfn[y];});

	for(auto u:tmp){
		if(!qry2(u)){
			if(u)bit2.mdf(dfn[u],1);

			S.insert(u);
		}
	}

	for(;S.size();t^=1){
		int u = *S.begin();S.erase(u);

		int val = sz[u];

		ans += val * t;

		if(!u)break;
		bit.mdf(dfn[u],val);
		bit2.mdf(dfn[u],-1);

		son[fa[u]].erase(u);
		assert(son[fa[u]].size());
		if(son[fa[u]].size() == 1){
			int p = *son[fa[u]].begin();
			dsu.rst(p);dsu.rst(fa[p]);
			if(S.find(p) != S.end()){
				S.erase(p);

				bit2.mdf(dfn[p],-1);

				int to = dsu.find(p);

				assert(S.find(to) == S.end());
				if(!qry2(to)){
					sz[to] -= qry(to);

					if(to)bit2.mdf(dfn[to],1);
					S.insert(to);
				}
			}
		}
	}

	cout<<ans<<endl;
    return 0;
}

Submission Info

Submission Time
Task F - Subtree Reversi
User Crying
Language C++ (GCC 9.2.1)
Score 900
Code Size 3444 Byte
Status AC
Exec Time 105 ms
Memory 54408 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 900 / 900
Status
AC × 2
AC × 59
Set Name Test Cases
Sample sample-01.txt, sample-02.txt
All in-01.txt, in-02.txt, in-03.txt, in-04.txt, in-05.txt, in-06.txt, in-07.txt, in-08.txt, in-09.txt, in-10.txt, in-11.txt, in-12.txt, in-13.txt, in-14.txt, in-15.txt, in-16.txt, in-17.txt, in-18.txt, in-19.txt, in-20.txt, in-21.txt, in-22.txt, in-23.txt, in-24.txt, in-25.txt, in-26.txt, in-27.txt, in-28.txt, in-29.txt, in-30.txt, in-31.txt, in-32.txt, in-33.txt, in-34.txt, in-35.txt, in-36.txt, in-37.txt, in-38.txt, in-39.txt, in-40.txt, in-41.txt, in-42.txt, in-43.txt, in-44.txt, in-45.txt, in-46.txt, in-47.txt, in-48.txt, in-49.txt, in-50.txt, in-51.txt, in-52.txt, in-53.txt, in-54.txt, in-55.txt, in-56.txt, in-57.txt, sample-01.txt, sample-02.txt
Case Name Status Exec Time Memory
in-01.txt AC 79 ms 54344 KB
in-02.txt AC 81 ms 54248 KB
in-03.txt AC 14 ms 17604 KB
in-04.txt AC 14 ms 17604 KB
in-05.txt AC 15 ms 17600 KB
in-06.txt AC 14 ms 17596 KB
in-07.txt AC 79 ms 54292 KB
in-08.txt AC 77 ms 54408 KB
in-09.txt AC 80 ms 54296 KB
in-10.txt AC 77 ms 54408 KB
in-11.txt AC 63 ms 39516 KB
in-12.txt AC 62 ms 39516 KB
in-13.txt AC 62 ms 39472 KB
in-14.txt AC 61 ms 39412 KB
in-15.txt AC 75 ms 34180 KB
in-16.txt AC 50 ms 26128 KB
in-17.txt AC 93 ms 36992 KB
in-18.txt AC 88 ms 37036 KB
in-19.txt AC 81 ms 33640 KB
in-20.txt AC 85 ms 34144 KB
in-21.txt AC 88 ms 34040 KB
in-22.txt AC 93 ms 35056 KB
in-23.txt AC 96 ms 35628 KB
in-24.txt AC 93 ms 36560 KB
in-25.txt AC 92 ms 36856 KB
in-26.txt AC 105 ms 38980 KB
in-27.txt AC 90 ms 37068 KB
in-28.txt AC 84 ms 35396 KB
in-29.txt AC 81 ms 35032 KB
in-30.txt AC 76 ms 33264 KB
in-31.txt AC 67 ms 30968 KB
in-32.txt AC 71 ms 32328 KB
in-33.txt AC 63 ms 30020 KB
in-34.txt AC 71 ms 33220 KB
in-35.txt AC 66 ms 30764 KB
in-36.txt AC 59 ms 28988 KB
in-37.txt AC 77 ms 34160 KB
in-38.txt AC 63 ms 30312 KB
in-39.txt AC 32 ms 22568 KB
in-40.txt AC 29 ms 22464 KB
in-41.txt AC 50 ms 34096 KB
in-42.txt AC 56 ms 37584 KB
in-43.txt AC 72 ms 45124 KB
in-44.txt AC 72 ms 32168 KB
in-45.txt AC 28 ms 22312 KB
in-46.txt AC 33 ms 23016 KB
in-47.txt AC 30 ms 22096 KB
in-48.txt AC 34 ms 22156 KB
in-49.txt AC 34 ms 22260 KB
in-50.txt AC 34 ms 21884 KB
in-51.txt AC 32 ms 23084 KB
in-52.txt AC 33 ms 23516 KB
in-53.txt AC 35 ms 22624 KB
in-54.txt AC 35 ms 22792 KB
in-55.txt AC 85 ms 38848 KB
in-56.txt AC 75 ms 35320 KB
in-57.txt AC 87 ms 35168 KB
sample-01.txt AC 15 ms 17676 KB
sample-02.txt AC 14 ms 17600 KB