眾所周知,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求出割點,再遍歷每個連通分量,根據割點個數分類即可。
#includeusingview codenamespace
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);
}
暑假 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為了滿足自己的求食慾,它不得不花錢來圈乙個正方形,但它想花的錢盡可能少,...