1. 程式人生 > >洛谷P3605 [USACO17JAN]Promotion Counting晉升者計數

洛谷P3605 [USACO17JAN]Promotion Counting晉升者計數

再次 輸入 ast 一行 range shc rdquo const 問題

洛谷P3605 [USACO17JAN]Promotion Counting晉升者計數

題目描述

奶牛們又一次試圖創建一家創業公司,還是沒有從過去的經驗中吸取教訓--牛是可怕的管理者!

為了方便,把奶牛從 $1 \cdots N(1 \leq N \leq 100, 000)$ 編號,把公司組織成一棵樹,1 號奶牛作為總裁(這棵樹的根節點)。除了總裁以外的每頭奶牛都有一個單獨的上司(它在樹上的 “雙親結點”)。所有的第 $i$ 頭牛都有一個不同的能力指數 $p(i)$,描述了她對其工作的擅長程度。如果奶牛 $i$ 是奶牛 $j$ 的祖先節點(例如,上司的上司的上司),那麽我們我們把奶牛 $j$ 叫做 $i$ 的下屬。

不幸地是,奶牛們發現經常發生一個上司比她的一些下屬能力低的情況,在這種情況下,上司應當考慮晉升她的一些下屬。你的任務是幫助奶牛弄清楚這是什麽時候發生的。簡而言之,對於公司的中的每一頭奶牛 $i$,請計算其下屬 $j$ 的數量滿足 $p(j) > p(i)$。

輸入輸出格式

輸入格式:

輸入的第一行包括一個整數 $N$。

接下來的 $N$ 行包括奶牛們的能力指數 $p(1) \cdots p(N)$. 保證所有數互不相同,在區間 $1 \cdots 10^9$ 之間。

接下來的 $N-1$ 行描述了奶牛 $2 \cdots N$ 的上司(雙親節點)的編號。再次提醒,1 號奶牛作為總裁,沒有上司。

輸出格式:

輸出包括 $N$ 行。輸出的第 $i$ 行應當給出有多少奶牛 $i$ 的下屬比奶牛 $i$ 能力高。

輸入輸出樣例

輸入樣例#1: 復制
5
804289384
846930887
681692778
714636916
957747794
1
1
2
3
輸出樣例#1: 復制
2
0
1
0
0

說明

感謝@rushcheyo 的翻譯

代碼

樹上的逆序對問題,用樹狀數組求,還是原來的思路,但要註意去掉不在一個子樹上的。

#include<iostream>
#include<cstdio>
#include
<cstring> #include<algorithm> using namespace std; const int N=100010; 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*10+ch-0;ch=getchar();} return x*f; } int n,tot,head[N],b[N],c[N],fa[N],ans[N]; struct node{ int next,to; }e[N]; struct data{ int x,id; bool operator < (const data &j)const { return x<j.x; } }a[N]; inline void ins(int from,int to){ e[++tot].next=head[from]; e[tot].to=to; head[from]=tot; } inline void update(int x,int val){ for(;x<=n;x+=x&(-x)) c[x]+=val; } inline int query(int x){ int res=0; for(;x;x-=x&(-x)) res+=c[x]; return res; } void dfs(int x){ update(b[x],1); int last=query(n)-query(b[x]); for(int i=head[x];i;i=e[i].next) if(e[i].to!=fa[x]) dfs(e[i].to); ans[x]=query(n)-query(b[x])-last; } int main(){ n=read(); for(int i=1;i<=n;++i) a[i].x=read(),a[i].id=i; sort(a+1,a+n+1); for(int i=1;i<=n;++i) b[a[i].id]=i; for(int i=2;i<=n;++i){ int x=read(); fa[i]=x; ins(x,i); } dfs(1); for(int i=1;i<=n;++i) printf("%d\n",ans[i]); return 0; }

洛谷P3605 [USACO17JAN]Promotion Counting晉升者計數