日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【HihoCoder - 1881】特殊任务 (树形图,遍历)

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【HihoCoder - 1881】特殊任务 (树形图,遍历) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題干:

H公司一共有N名員工,編號1~N,其中CEO是1號員工。除了CEO之外,其他員工都有唯一的直接上司,所以N名員工上下級關系恰好形成了一棵樹形結構。 ?

我們知道每一名員工向H公司的代碼庫貢獻了多少行代碼。具體來說,第i名員工貢獻了Ai行代碼。

現在有一項特殊的任務需要2名員工完成,這兩名員工需要滿足:

1. 其中一名是另一名的直接或者間接上司

2. 兩人貢獻代碼行數的差值越大越好

請你在所有員工中找出符合條件的2人,輸出他們代碼行數的差值。

Input

第一行包含一個整數N。

第二行包含N個整數A1, A2, ... AN。 ?

以下N-1行每行包含一個整數,依次是P2, P3, ... PN,其中Pi代表第i名員工的上司編號。 ?

對于30%的數據,1 ≤ N ≤ 1000

對于100%的數據,1 ≤ N ≤ 100000, 0 ≤ Ai?≤ 100000, 1 ≤ Pi?≤ N

Output

一個整數代表答案

Sample Input

6 50 70 100 40 20 0 1 1 2 4 4

Sample Output

70

解題報告:

? ?這題思路有如下幾種,法一:dfs序+線段樹(但是這題沒有更新所以就沒必要)。法二:直接遍歷這棵樹。其次這題沒說清楚啊n等于1是什么鬼?不是讓選兩個人嗎?特判了一下(但是加不加那一句都可以AC,,貌似樣例中就沒有這個樣例)

簡單介紹一下變量的含義:

pair的mM分別代表最小值 ?最大值
tmp是所有子樹的最小值 ?TMP 是所有子樹的最大值
pair是單個子樹帶回的最大值最小值

AC代碼:

#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; vector<int> vv[MAX]; ll a[MAX]; ll maxx; pair<ll,ll> dfs(int cur,int root) {int up = vv[cur].size();ll tmp,TMP;tmp=TMP=a[cur];for(int i = 0; i<up; i++) {int v = vv[cur][i];if(v == root) continue;pair<ll,ll> mM = dfs(v,cur);tmp = min(tmp,mM.fi);TMP = max(TMP,mM.se);//maxx = max(maxx,max(mM.se,a[cur]) - min(mM.fi,a[cur]));maxx = max(maxx,abs(mM.second-a[cur]));maxx = max(maxx,abs(mM.first-a[cur]));}return pm(tmp,TMP); } int main() {int n,m;cin>>n;for(int i = 1; i<=n; i++) scanf("%lld",a+i);for(int i = 2; i<=n; i++) {int x;scanf("%d",&x);vv[i].pb(x);vv[x].pb(i);} // if(n == 1) { // puts("0");return 0 ; // }pair<ll,ll> mM = dfs(1,-1);printf("%lld\n",maxx);return 0 ;}/* 5 11 10 20 3 10 1 2 1 4*/

總結:

? 遍歷的時候剛開始還是出錯了。。。不能直接用tmp和TMP去更新maxx,,,因為每棵子樹得分開算,并且維護一個tmp和TMP返回給父節點。。然后不能用那個注釋掉的那個maxx的更新,因為你只能用帶回來的值去和a[cur]去做運算,,不能直接在這兩者中選一個大的,兩者中選一個小的去做運算來維護maxx、、、還是要注意一下子節點(所有子樹)和單個子樹的區別吧

總結

以上是生活随笔為你收集整理的【HihoCoder - 1881】特殊任务 (树形图,遍历)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。