暑假 D4T2 rabbit(割點 礦場搭建)

2022-08-01 18:15:12 字數 2038 閱讀 8254

眾所周知,bfk家的後院有一片胡蘿蔔田

這片田地很受兔子們的喜愛,兔子們為了方便偷吃胡蘿蔔,在地下打出了一片洞穴網路。bfk早就發現了它家的蘿蔔田裡兔子氾濫的情形,因此,它決定先外出旅遊幾天,讓兔子們放鬆警惕,回家時再將兔子們一網打盡。

具體的,我們可以將洞穴網路抽象成乙個n條邊的圖。bfk的策略是,隨機堵住某個節點,如果這個點是地下網路的必經之路,那麼它就可以守洞待兔了。兔子們並不想坐以待斃,因此它們決定在某些節點挖出通向地面的出口,使得無論bfk堵住哪個節點,兔子們都可以直接從某個出口溜走。

但是兔子們只會計算1+1=2,對於如此複雜的問題,它們毫無頭緒。請你幫忙計算一下,兔子們至少需要挖多少個出口才能滿足上述條件,以及在出口數最少的情況下,出口的分布方式有多少種

第一行乙個正整數n,表示地下網路的邊數

接下來n行,每行兩個整數u,v表示有一條雙向邊連通了u,v兩點

輸出一行兩個整數 cnt,tot。其中,cnt 表示最少出口數,tot表示在出口數最少的情況下,設定出口的方案數在模998244353意義下的值

對於 20% 的資料,n≤15

對於 40% 的資料,n≤10000

對於 68% 的資料,n≤100000

對於全部資料,n≤2000000 ,資料有梯度

保證有 16% 的資料滿足,該圖任意兩點間至少有兩條點不重複的路徑

保證無自環,但不保證無重邊

看到題很容易想到割點,割點把圖分成很多點連通分量。

如果沒有割點,那麼需要選兩個點,只選乙個點的話,如果那個點被蹲就沒地方出去了。方案數c(2,num)

對於上或下兩個連通分量,他們都有乙個割點,只需要選乙個出口,如果蹲割點,就可以在各自出口出;蹲自己的出口,就可以去對面的出口。

對於(2,5,6)中間這個連通分量,有兩個割點,不需要選出口,因為可以到旁邊的連通分量去。

所以先tarjan求出割點,再遍歷每個連通分量,根據割點個數分類即可。

#includeusing

namespace

std;

#define ll long long

const

int maxn=2000005

;const

int mod=998244353

;int

n,m,cur;

ll timer,num,cnt;

ll ans1,ans2=1

;int

dfn[maxn],low[maxn];

intvis[maxn];

bool

cut[maxn];

vector

e[maxn];

template

inline void read(t &x)

}int max(int x,int y)

int min(int x,int y)

void tarjan(int u,int

fa)

else

if(v!=fa) low[u]=min(low[u],dfn[v]);

}}void dfs(int

u)

if(!vis[v]) dfs(v);

}}int

main()

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

if(!dfn[i])

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

if(!vis[i]&&!cut[i])

}else

if(cnt==1

) }

printf(

"%lld %lld

",ans1,ans2);

}

view code

暑假 D2 T2 熱點

輸入 輸入檔案為hotspot.in。輸入的第一行為兩個正整數n,m。接下來的m行,每行描述乙個事件。輸出 輸出檔案為hotspot.out。輸出僅一行,n個整數,第i個數表示第i個人總共收到的動態數。輸入輸出樣例1 hotspot.in hotspot.out 2 8 s 1 s 2 l 1 2 ...

暑假 D1 T2 咖啡的藝術

掃瞄線 事件點 0集合 描述了每一種咖啡的溫度區間 l,r l 1 r 1 1 1集合 描述了每乙個查詢區間 l,r l i r 1 i top記錄n集合的差分字首和 now記錄q集合的差分字首和。構造好事件點後按l r 排一遍序 按順序往後掃。if cnt1 k ans 區間長度 i includ...

2017 10 4 國慶清北 D4T2 正方形

在乙個10000 10000的二維平面上,有n顆糖果。lyk喜歡吃糖果!並且它給自己立了規定,一定要吃其中的至少c顆糖果!事與願違,lyk只被允許圈出乙個正方形,它只能吃在正方形裡面的糖果。並且它需要支付正方形邊長的價錢。lyk為了滿足自己的求食慾,它不得不花錢來圈乙個正方形,但它想花的錢盡可能少,...