洛谷P5603 小C與桌遊

2022-05-26 20:36:32 字數 2027 閱讀 1384

題目鏈結

小c是乙個熱愛桌遊的高中生,現在他被乙個桌遊難住了,快來幫幫他!

這個桌遊的地圖可以被抽象成乙個\(n\)個點,\(m\)條邊的有向無環圖(不保證連通),小c在這個地圖上行走,小c能走到某個點當且僅當能夠到達這個點的所有點都已經被小c走到。小c會走到每個點恰好\(1\)次,並且他能走到哪些點與他當前所在的點沒有關係(即可以走到與當前所在的點沒有連邊的點,只要滿足之前的條件)。

小c每走到乙個標號比之前走到的點都大的點,他就會有\(\frac\)的概率從對手那裡拿到\(1\)塊籌碼,有\(\frac\)的概率給對手\(1\)塊籌碼,雙方初始各有\(1919810\)個籌碼。

小c的運氣時好時壞,所以他希望你幫他計算出:

第一行兩個正整數\(n,m\)。

接下來\(m\)行,每行兩個正整數\(u, v\),表示地圖上有一條有向邊\((u, v)\),不保證無重邊。

輸出兩行,每行乙個正整數,第一行表示最優情況下小c能拿到的籌碼數,第二行表示最劣情況下小c會失去的籌碼數。

3 2

1 21 3

3

2

最優情況下的行走方式是\(1-2-3\),最劣情況下的行走方式是\(1-3-2\)。

對於每乙個測試點:

對於\(20\%\)的資料,\(1 \le n,m \le 10\)。

對於\(40\%\)的資料,\(1 \le n,m \le 2000\)。

對於\(100\%\)的資料,\(1 \le n, m \le 5 \times 10^5\),\(1 \le u, v \le n\)。

題意:給你一張\(n\)個點的有向無環圖,這個圖的每種拓撲排序有乙個價值,每當在拓撲序列中加入乙個節點編號比已加入的所有節點編號都打的節點的時候,這個拓撲序的價值就會加一。

要求這張圖拓撲排序中最大的價值和最小的價值。

既然求最大的價值和最小的價值,因為列舉每一種拓撲序時間複雜度很高(其實是太麻煩,懶得打),所以我們在這裡考慮貪心的演算法。

因為只有在序列中加入比之前加入的所有節點編號都大的節點時價值才會公升高,所以如果有乙個可以加入的節點編號小於已加入的最大的節點編號\(max\),那麼加入這個節點的作用是擴充套件能加入的節點。(顯然的)

那麼我們很容易想到最大的價值是從小到大加入拓撲序,最小的價值是從大到小加入拓撲序。

這裡注意一下:這裡提到的從小到大加入以及從大到小加入的前提是\(max\)編號以下已經沒有可以加入的點了。

更多細節可以看**理解。

上**:

#includeusing namespace std;

int n,m,u,v;

int s[500009],ss[500009];

int q1[500009],l1,q2[500009],l2;

int mx,mn,sss;

int ans1,ans2=1;

bool k[500009];

struct aap[500009];

int h[500009],len;

void add(int u,int v)

void dd(int u,int mx)

}void d2(int u,int mx)

}}int main()

for(int j=1;j<=n;j++)

ss[j]=s[j];

for(int j=1;j<=n;j++)

if(s[j]==0)

for(int j=1;j<=n;j++)

s[j]=ss[j];

for(int j=1;j<=n;j++)

if(s[j]==0)

for(int j=1;j<=l1;j++)

d2(q1[j],mx);

while(l2!=0)

l2=0;

for(int j=1;j<=l1;j++)

d2(q1[j],mx);

}printf("%d\n%d",ans1,ans2);

return 0;

}

拓撲排序 貪心 小C與桌遊(洛谷 P5603)

題目描述 這個桌遊的地圖可以被抽象成乙個 n 個點,m 條邊的有向無環圖 不保證連通 小c在這個地圖上行走,小c能走到某個點當且僅當能夠到達這個點的所有點都已經被小c走到。小c會走到每個點恰好 1 次,並且他能走到哪些點與他當前所在的點沒有關係 即可以走到與當前所在的點沒有連邊的點,只要滿足之前的條...

Luogu P5603 小C與桌遊

這個題一看和入度扯上關係就是明顯的topo了。對於最優情況,直接維護小根堆,貪心即可。對於最劣情況,顯然直接維護大根堆然後貪心是錯誤的 反例見luogu題解 所以每次要取出所有能拓展的節點,依次加入佇列topo即可。這裡注意當連到的點比當前最大值大時,壓入大根堆,否則加入佇列。code includ...

洛谷10月月賽 III 小C與桌遊

該問題可以分為兩個子問題 1.求一種拓撲順序使點的編號最大值的更新次數最多。2.求一種拓撲順序使點的編號最大值的更新次數最少。對於第乙個子問題,我們貪心的想,每次走到所有能走的點中編號最小的點。這種貪心顯然是正確的,因為如果我們先走編號較大的點,再走編號較小的點,顯然不如先走編號較小的點更優一些。所...