D题暴力求解只求小于等于二的边即可 卡了我的输入输出我晕
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
int sum1[maxn],sum2[maxn],son[maxn];
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void write(int x)
{
char F[200];
int tmp=x>0?x:-x ;
if(x<0)putchar('-') ;
int cnt=0 ;
while(tmp>0)
{
F[cnt++]=tmp%10+'0';
tmp/=10;
}
while(cnt>0)putchar(F[--cnt]) ;
}
int main()
{
ios::sync_with_stdio(0);
int n,k;
n=read();
for(int i=1;i<=n;i++)
son[i]=i;
for(int i=2;i<=n;i++)
{
int a,b;
a=read();
b=read();
if(b<=2)
{
if(b==1)
{
if(son[a]!=a)
{
sum2[son[a]]++;
}
sum1[i]++;
sum1[a]++;
son[i]=a;
}
else
{
sum2[i]++;
sum2[a]++;
}
}
}
for(int i=1;i<=n;i++)
{
int h;
if(i!=son[i])
h=sum1[i]+sum2[i]+sum1[son[i]];
else
h=sum1[i]+sum2[i]+1;
write(h);
printf("\n");
}
return 0;
}