GDOI2015 水題 tarjan縮點

2022-05-03 19:09:10 字數 1489 閱讀 3120

這一題,我當年只會$60$分做法。。。。。

我們考慮對原圖跑一波邊雙,然後縮成乙個森林。

對於森林中的每一棵樹,我們欽定乙個根。

令$siz[x]$表示以$x$為根的子樹中,在原圖中點的個數。

令當前的答案為$ans$

對於一條邊$(u,v)$,如果這兩個點在縮點後的同個點內,那麼什麼都不用管,直接輸出$ans$即可。

否則我們先令$u=d[u]$,$v=d[v]$,其中$d[i]$表示原圖中第$i$號點在縮點後的森林中的編號。

顯然這兩個點在同一棵樹內,不妨設$dep[u]>dep[v]$,令$rt$表示$u$所在的樹的根。

顯然斷掉這條邊,增加的非聯通點對個數為$siz[u]\times (siz[rt]-siz[u])$。

加上$ans$輸出即可。

注意對1000取模!!!

1 #include2

#define l long long

3#define m 100005

4using

namespace

std;56

struct edgee[m*22]=; int head[m]=,head1[m]=,use=0;7

void add(int x,int y)

8void add1(int x,int y)

9int dfn[m]=,low[m]=,b[m]=,d[m]=,siz[m]=,cnt=0,t=0; stacks;

10int

n,m,q;

11void dfs(int x,int

fa)18

if(dfn[x]==low[x])while(u!=x);24}

25}26int du[m]=,dep[m]=,ff[m]=;

27void dfs1(int x,int

fa)33

34int u[m*10]=,v[m*10]=;

35int

main()

44for(int i=1;i<=n;i++) if(!dfn[i])

45 dfs(i,-1

);46

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

47for(int i=head[x];~i;i=e[i].next)

48if(d[x]!=d[e[i].u])

51 l ans=1ll*n*n;

52for(int i=1;i<=cnt;i++)

53if(du[i]==0||(du[i]==1&&dep[i]==0

))57 ans/=2;58

while(q--)

63if(dep[x]

64 l minus=1ll*siz[x]*(siz[ff[y]]-siz[x]);

65 printf("

%lld\n

",(ans+minus)%1000

);66

}67 }

GDOI2015模擬12 20 雞腿 夢境

雞腿做了乙個好夢呢!他化身鋼鐵俠大戰全宇宙的各種怪物,並且取得了勝利。在夢的結尾,雞腿開的飛船困在了一片廢棄飛船群中,同時由於引擎故障,他只能在平面內移動。廢棄飛船群可以描述為許多圓形的飛船,當然因為各種奇怪的原因,飛船可能疊加在一切。雞腿也駕駛著飛船在這個平面中。一開始的時候雞腿的飛船是不會和廢棄...

GDOI2015模擬12 21 雞腿 桌球

桌球遊戲可不是桌球!桌球好像也和這個遊戲沒啥關係。這個遊戲的主角就是 區間。對於兩個區間,如果 a,b 和 c,d 區間滿足 c a d c a c b d c b d,就可以從 a,b 到 c,d 去。然後現在有兩種操作,分別是 1 x y x y 表示在區間集合中新增 x,y 這個區間,保證新加...

10 18T5水題刷自信

最長匹配3526 問題描述 對乙個由 括號組成的字串,求出其中最長的括號匹配子串。具體來說,滿足如下條件的字串成為括號匹配的字串 1.是括號匹配的字串。2.若a是括號匹配的串,則 a a 是括號匹配的字串。3.若a,b是括號匹配的字串,則ab也是括號匹配的字串。例如 都是括號匹配的字串,而 則不是。...