记录编号 |
187884 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[ZJOI 2004] 树的果实 |
最终得分 |
100 |
用户昵称 |
mikumikumi |
是否通过 |
通过 |
代码语言 |
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;
}