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