這一題,我當年只會$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也是括號匹配的字串。例如 都是括號匹配的字串,而 則不是。...