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 |
|
|
| 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 |