NKOJ 4240 人數統計

2021-08-08 09:21:36 字數 2717 閱讀 5147

p4240 人數統計

問題描述

何老闆經營著一家大公司, 公司總共有 n 個員工, 編號 1 到 n。 何老闆編號 1。

除了何老闆外, 每個員工有且僅有乙個直接上司(呈樹狀)。 每個員工都有乙個工作能力值。 何老闆想知道, 對於第 i 號員工, 他的所有下屬(包括間接的下屬)中, 能力值比 i 強的有多少人? (即統計 i 為根的子樹中, 能力值比 i 大的節點數)

輸入格式

第一行, 乙個整數 n, 表示公司職員的總數, 員工編號 1 到 n。

接下來 n 行, 每行乙個整數, 其中第 i 行表示 i 號員工的能力值。

接下來 n-1 行, 每行乙個整數, 其中第 i 行的整數表示編號 i+1 的員工的直接上司的編號。

輸出格式

n 行, 每行乙個整數, 其中第 i 行表示編號為 i 的員工的下屬中, 能力比 i 強的人數。
輸入輸出樣例

樣例輸入 1

5 8

0424

85697

66168

70466

95774

1 1 2 3

樣例輸出 1

2 0 1 0 0
樣例說明 無

資料範圍

對於約 30%的資料,有 2<=n<=200

對於約 100%的資料,有 2<=n<=100,000 1<=能力值<=1,000,000,000.

其實很容易想到深搜統計能力值大於當前節點的節點個數

所以我們優化就在於統計上面

我們開乙個陣列cnt

cnt[i]=(當前的能力值==i的人的個數)

然後我們在每次求結果時只需要求cnt[i]>當前能力值的點即可

那麼統計就很簡單了 用樹狀陣列

關鍵在於 怎麼能夠讓所有結點共用乙個cnt陣列

如果只用乙個cnt就會出現 當前求出的和 包含了 別人家的兒子

樣例資料

我們可以得到搜尋順序 1->2->4->3->5

我們的思路是 在跑完p的所有兒子之後 統計能力值大於p的能力值的點的個數

但是對於三號點 就會出現一種很尷尬的情況

三的cnt當中可能包含二的兒子的統計

那麼這個時候我們操作就是

在跑p的兒子之前 先統計能力值大於p的能力值的點的個數

然後跑p的兒子

然後再一次統計能力值大於p的能力值的點的個數

前後之差即為 真·比爸爸強的兒子的個數

而不是 偽·比叔叔強的侄子的個數

我也不知道是誇這些員工強,還是誇這些員工能力強…

所以我們就要離散化

比如對於能力值 987654 654321 123456 224567

他們從大到小排序之後

987654 654321 224567 123456

我們就記錄點的值排序後它的能力值的位置

點 位置 原能力值

1 1 987654

2 2 654321

3 4 123456

4 3 224567

那麼在每次統計後 我們只需要在 點的位置上 +1 即可

然後由於我們是從大到小排序的

所以我們只需要用樹狀陣列統計位置小於 當前點位置 的位置 的值之和(很繞)

於是能力值被強行轉成了[1,100000]之間的值

這樣就不會爆空間了

在重新編號(離散化)時能力值相同的的點應該標成相同的位置

//在oj上要交要擴棧 所有注釋的語句不是 擴棧 就是 輸入輸出

#include

#include

#include

#define lowbit(i) (i&-i)

using

namespace

std;

struct companya[100123];

bool cp1(company a,company b)

bool cp2(company a,company b)

inline

int input()

int add(int p)//樹狀陣列點修改

int sum(int p)//樹狀陣列的 統計

int dfs(int s)//簡單暴力的深搜

int main()

sort(a+1,a+n+1,cp2);

dfs(1);

for(int i=1;i<=n;i++)printf("%d\n",cnt[i]);

// __asm__("movl (%%eax), %%esp;\n"::"a"(my_stack):"%esp");

}

行情分發節點資訊統計 登陸人數, 合約數

h2.需求 實時統計 分發節點的登入人數 以圖形形式顯示所有 分發節點登陸人數總和以及 單個 分發節點上登陸的人數 以圖形形式現實所有 節點頻寬消耗 h2.方案 分發節點之間乙個搭建rabbit mq節點 客戶端連線 分發節點時向rabbit mq節點傳送連線訊息 客戶端斷線時向rabbit mq節...

第九周實踐專案3 人數不定的工資類

問題及 all right reserved.檔名稱 77.cpp 作 者 董凱琦 完成日期 2016年4月28日 版 本 號 v1.0 問題描述 設計乙個工資類 salary 其中的資料成員包括職工人數 number,人數不定 和number個職工的工資salary,要求輸入職工工資並逐個輸出。程...

第6周專案3 人數不定的工資類

檔名稱 test.cpp 作 者 劉暢 完成日期 2015年 4 月 11 日 版 本 號 v1.0 問題描述 設計乙個工資類 salary 其中的資料成員包括職工人數 number,人數不定 和number個職工的工資salary,要求輸入職工工資並逐個輸出。應用。將salary宣告為指標型別的成...