fateice 來到了魔方俱樂部旅行。
魔方俱樂部有n個分部,每個分部均有且僅有乙個蟲洞,但是這蟲洞只能通往乙個分部。
每個分部有乙個 orzfang 價值,第i個分部的 orzfang 價值為a[i]。
現在他想知道,從第i個分部出發,並只通過蟲洞前往下乙個分部,orzfang 價值之和最多是多少(到達乙個分部多次只計算1次 orzfang 價值)。
輸入格式
第一行為乙個正整數n 。
第二行有n個非負整數a[i] ,表示了每個分部的 orzfang 價值。
第三行有n個正整數f[i] ,表示通過第i個分部的蟲洞所到達的分部為f[i] ,可能出現f[i]=i的情況。
輸出格式
包括n行,第i行包含乙個非負整數,表示從第i個分部出發,orzfang 價值之和的最大值為多少。
樣例樣例輸入
85 4 3 2 1 1 1 1
2 3 1 1 2 7 6 8
樣例輸出
1212
1214132
21資料範圍與提示
對於20%的資料,n≤10。
對於40%的資料,n≤1000。
對於100%的資料,1≤n≤2e5,1≤ai≤104
首先看到這種帶環的,而且i只會有乙個f[i],
蒟蒻就自然而然的想到了tarjan,對於這種環也就是強連通分量,
於是就往下寫了縮點,最後用記憶化搜尋去得到每乙個i的ans
可就是莫名其妙就mle,
如果有大佬知道蒟蒻mle於何處,必當萬分感謝!!!
}ac思路就是,通過題意,很容易發現資料長得是格外好看
描述一下就是多個環,然後環上套了幾條鏈
極端資料f[i]=i,就有可能是一條單鏈加乙個自環,也不影響
對於這種一條條的單鏈,我們可以思考拓撲排序,甩到棧裡面去
為什麼是棧呢?
因為棧是先進後出,後進先出,我們正好要得到後進的f[i]答案再去更新i的答案
然後,就只剩下乙個又乙個互不打擾的環了,
因為是環,所以從環上任意乙個點都可以開始搜尋更新答案
我們可以用佇列來模擬,把這個環上的節點在dfs更新ans的時候
順便記錄一下經過哪些節點,最後把佇列清空的時候就順便更新一下ans[i]
環處理好了的話就回到了之前棧的處理上,從後往前掃棧,直接更新ans[i]就可以了
可以保證i能走到的蟲洞都已經有了答案
#include
#include
#include
using
namespace std;
#define maxn 200005
queue <
int> q;
stack <
int> sta;
int n;
int d[maxn]
, f[maxn]
, orz[maxn]
, ans[maxn]
;bool vis[maxn]
;void top_sort ()}
void dfs (
int u,
int root )
void circle ()}
}int
main()
top_sort ();
circle ();
while
(! sta.
empty()
)for
(int i =
1;i <= n;i ++
) printf (
"%d\n"
, ans[i]);
return0;
}
就這樣就能ac,所以為什麼我的tarjan不可以,啊啊啊啊!!!
魔方俱樂部
我終於a了。還是靠旁邊大佬的百般幫助 太菜了,真的太菜了。首先,我們應該仔細審題!審題不過關的我,在乙個錯誤的題目上耗了乙個下午連樣例都沒有過!tcl 這題的重點有且僅有乙個 乙個點只會通向乙個節點!那麼我們可以發現,整張圖其實是幾個環和幾個通向環的鏈組成!然後上馬吧!include include...
俱樂部活動 2007 06 03
為了便於廣大會員交流,定於 2007年6 月3 日舉行乙個小型技術交流會 每個主題10分鐘左右時間 活動主題為展示各位會員的作品或者一些心得體會 可以是自己平時的作品,也可以單獨寫乙個小軟體,也可以採用文件展示自己的心得體會,如有 demo 請事先準備好 本次活動採用網上報名確認的方式,待確認之後方...
魔方陣1 奇階魔方陣
魔方陣 古代又稱 縱橫圖 是指組成元素為自然數1 2 n2的平方的n n的方陣,其中每個元素值都不相等,且每行 每列以及主 副對角線上各n個元素之和都相等。魔方陣分為奇階魔方陣和偶階魔方陣,偶階魔方陣又分為能被四整除和不能被四整除兩種,今天來給大家講解奇階魔方陣,後續會為大家補充剩餘的魔方陣。奇階魔...