记录编号 187884 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2004] 树的果实 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 1.719 s
提交时间 2015-09-20 21:33:11 内存使用 19.97 MiB
显示代码纯文本
#include<cstdio>
#include<deque>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<iostream>
#include<iomanip>
using namespace std;
int Bit[100010]={0};
int N,father[100010]={0};
int pos[100010]={0};//dfs序
int D[100010]={0},P[100010]={0},tot;
deque<int> sw[100010];
class poi
{
    public:
	int de,pos;
}T[100010];//离散化前的美味值
int de[100010]={0};//离散化后的美味值
bool cmp(poi a,poi b)
{
	return a.de<b.de;
}
void read()
{
	scanf("%d",&N);
	for(int i=2;i<=N;i++)
	{
		scanf("%d",&father[i]);
		sw[father[i]].push_back(i);
	}
	for(int i=1;i<=N;i++)
	{
		scanf("%d",&T[i].de);
		T[i].pos=i;
	}
	sort(T+1,T+N+1,cmp);
	int tot=0;
	for(int i=1;i<=N;i++)
		de[T[i].pos]=++tot;
}
int lowbit(int x)
{
	return x&(-x);
}
int sum(int x)
{
	int re=0;
	while(x>0)
	{
		re+=Bit[x];x-=lowbit(x);
	}
	return re;
}
void add(int x,int t)
{
	while(x<=N){Bit[x]+=t;x+=lowbit(x);}
}
void mem()
{
	tot=0;
	memset(Bit,0,sizeof(Bit));memset(pos,0,sizeof(pos));
}
void dfs1(int x)
{
	P[x]=sum(N)-sum(de[x]);
	add(de[x],1);
	for(int i=0;i<sw[x].size();i++)
	{
		dfs1(sw[x][i]);
	}
	add(de[x],-1);
}
void dfs2(int x)
{
	pos[++tot]=x;
	for(int i=0;i<sw[x].size();i++)
		dfs2(sw[x][i]);
}
void dfs3(int x)
{
	pos[++tot]=x;
	for(int i=sw[x].size()-1;i>=0;i--)
		dfs3(sw[x][i]);
}
void get()
{
	for(int i=N;i>=1;i--)
	{
		D[pos[i]]+=sum(N)-sum(de[pos[i]]);
		add(de[pos[i]],1);
	}
}
void work()
{
	mem();dfs1(1);
	mem();dfs2(1);get();
	mem();dfs3(1);get();
	int ans1,ans2,ans3;
	for(int i=1;i<=N;i++)
	{
		ans1=P[i]+D[i]-N+de[i];
		ans2=N-ans1-de[i];
		ans3=P[i];
		printf("%d %d %d\n",ans1,ans2,ans3);
	}
}
int main()
{
	freopen("treesfruits.in","r",stdin);
	freopen("treesfruits.out","w",stdout);
	read();
	work();
	return 0;
}