求看 CF C
  • 板块灌水区
  • 楼主ShunpowerSHUN理成张
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/4/9 00:50
  • 上次更新2023/10/28 04:14:11
查看原帖
求看 CF C
399150
ShunpowerSHUN理成张楼主2022/4/9 00:50

我的做法强行上树了,给 hack 也行,求助!!!

//Author:Zealous_YH
#include <bits/stdc++.h>
#define ET return 0
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
#define ull unsigned long long
#define bk break
#define ctn continue
#define inf INT_MAX
#define uinf INT_MIN
#define prq priority_queue
#define vr vector
#define pii pair<int,int>
#define pll pair<ll,ll>
#define debug puts("--------Chery AK IOI--------");
#define Yes cout<<"Yes"<<endl;
#define No cout<<"No"<<endl;
#define pt puts("")
#define efor(i,x) for(int i=head[x];i;i=edge[i].nex)
#define fr1(i,a,b) for(int i=a;i<=b;i++)
#define fr2(i,a,b) for(int i=a;i>=b;i--)
#define fv(i,p) for(int i=0;i<p.size();i++)
#define ld long double
#define S setiosflags(ios::fixed)<<setprecision(2)
using namespace std;
const int N=2e5+10;
int edgecnt=1;
int maxn=uinf,minn=inf;
struct Edge{
	int toe,val,nex;
} edge[N];
int head[N];
int low[N],dfn[N],vis[N],sccnum[N];
int tnt,tot;
void add(int x,int y,int w){
	edge[edgecnt].toe=y;
	edge[edgecnt].val=w;
	edge[edgecnt].nex=head[x];
	head[x]=edgecnt++;
}
int lowbit(int x){
	return x&-x;
}
inline void read(int &x){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){
   		if(ch=='-'){
			w=-1;
   		}
        ch=getchar();
	}
   while(ch>='0'&&ch<='9'){
   		s=s*10+ch-'0';
		ch=getchar();
   }
   x=s*w;
}
inline void write(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9){
    	write(x/10);
	}
    putchar(x%10+'0');
}
int T;
int n;
int f[N];
vector <int> p[N];
vector <int> d[N];
int ntd[N];
int maxdep;
void dfs(int x,int fa,int dep){
	d[dep].pb(x);
	maxdep=max(maxdep,dep); 
	fv(i,p[x]){
		if(p[x][i]!=fa){
			dfs(p[x][i],x,dep+1);
		}
	}
}
void solve(){
	maxdep=0;
	cin>>n;
	fr1(i,1,n){
		d[i].erase(d[i].begin(),d[i].end());
		p[i].erase(p[i].begin(),p[i].end());
	}
	fr1(i,2,n){
		cin>>f[i];
//		p[i].pb(f[i]);
		p[f[i]].pb(i); 
	}
	dfs(1,1,1);
	int cnt=0; 
	fr2(i,maxdep,1){
		fv(j,d[i]){
			ntd[d[i][j]]=p[d[i][j]].size();
		}
//		i--;
	}
	ntd[0]=1;
//	fr1(i,1,n){
//		cout<<ntd[i]<<" ";
//	}
//	pt;
	int sec=0;
	fr2(i,maxdep-1,1){
		fv(j,d[i]){
//			cout<<d[i][j]<<","<<ntd[d[i][j]]<<endl;
			if(ntd[d[i][j]]==0){
				ctn;
			}
			if(ntd[d[i][j]]==1&&p[d[i][j]].size()==1){
//				ntd[f[d[i][j]]]--;
				ntd[d[i][j]]=0;
				if(f[d[i][j]]!=0&&ntd[f[d[i][j]]]!=p[f[d[i][j]]].size()){
					ntd[f[d[i][j]]]--;
				}
				cnt++;
			}
			else if(ntd[d[i][j]]==1&&p[d[i][j]].size()>1){
				ntd[d[i][j]]=0;
				ntd[f[d[i][j]]]--;
				cnt++;
			}
			else if(ntd[d[i][j]]==p[d[i][j]].size()){
				bool g=0;
				ntd[d[i][j]]--;
				if(f[d[i][j]]!=0&&ntd[f[d[i][j]]]!=p[f[d[i][j]]].size()){
					ntd[f[d[i][j]]]--;
					g=1;
				}
				cnt++;
				int k=p[d[i][j]].size()-1;
				if(k%2==0){
					cnt+=k/2;
					ntd[d[i][j]]=0;
				}
				else{
					cnt+=k/2;
					if(g/*&&f[f[d[i][j]]]!=0*/){
						ntd[f[f[d[i][j]]]]--;
					}
					else{
						ntd[f[d[i][j]]]--;
					}
					ntd[d[i][j]]=0;
					cnt++;
				}
			}
			else if(ntd[d[i][j]]<p[d[i][j]].size()){
				int k=p[d[i][j]].size()-ntd[d[i][j]];
				if(k%2==0){
					cnt+=k/2;
					ntd[d[i][j]]=0;
				}
				else{
					cnt+=k/2;
					ntd[f[d[i][j]]]--;
					ntd[d[i][j]]=0;
					cnt++;
				}
			}
		}
//		i--;
	}
	if(ntd[0]==1){
		cnt++;
	}
	cout<<cnt<<endl;
//	cout<<cnt/2<<endl;
}
int main(){
	cin>>T;
	while(T--){
		solve();
	} 
	ET;
}
//Teens-in-Times
//HJL 2004.06.15
//Everything For Ji.


2022/4/9 00:50
加载中...