點此看題
題意:略
說明/提示:
我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。
資料範圍
1 ≤n
≤30000,1
≤m
≤100000,1
≤q
≤40000
1\leq n\leq 30000,1\leq m\leq 100000,1\leq q\leq 40000
1≤n≤30
000,
1≤m≤
1000
00,1
≤q≤4
0000
首先這題離線逆序處理不必多說了,這類刪除點/邊題固定套路----by洛谷某巨佬
什麼是離線逆序處理呢?簡而言之,就是先不急著加邊,先加全程都不會被刪除的邊,再逆序加入需要被刪除的邊,順便離線處理答案(加邊要比刪邊好做吧)。
我最先想到的是tarjan縮點,但要動態縮點(每次加邊都要重新搞),還是做不到。
這是我們來看看提示,題目保證任意時候圖聯通且沒有重邊,我們很容易想到縮點後是一顆樹,這樣關鍵路徑的數量就轉化為樹上路徑的邊數,考慮求lca
lcalc
a即可。
可是這樣還是要用縮點,我們考慮怎樣避免使用。
我們定義邊權為這條邊是否為關鍵節點(1/0
1/01/
0),先隨便搞出一顆不含被刪除邊的樹,邊權賦1,加邊時就把點對(u,v
u,vu,
v)到lca
lcalc
a樹上路徑全部更改為0(因為出現了環),詢問點到lca
lcalc
a的邊權之和。
又要區間修改,區間求和,還要支援lca
lcalc
a,直接上樹鏈剖分。
只是這裡我們要用點權代表該點到父親的邊是否是關鍵邊(至於根節點不用去管,反正也無意義),在套離線逆序處理即可。
終於口胡完了,看**把qwq。
#include
#include
#include
using
namespace std;
const
int maxn =
30005
;const
int maxm =
100005
;const
int maxq =
40005
;int
read()
int n,m,tot,cnt,a,f[maxn]
,p[maxn]
,num[maxn]
,ans[maxq]
;int index,siz[maxn]
,fa[maxn]
,son[maxn]
,dep[maxn]
,top[maxn]
;map<
int,
bool
> mp;
struct node
s[maxm]
;struct data
q[maxq]
;struct edge
e[maxn*2]
;struct tree
tr[maxn*4]
;int
get_hash
(int u,
int v)
intfindset
(int x)
void
dfs1
(int u,
int par)
son[u]
=max;
}void
dfs2
(int u,
int tp)
}void
build
(int i,
int l,
int r)
int mid=
(l+r)
>>1;
build
(i<<
1,l,mid)
;build
(i<<1|
1,mid+
1,r)
; tr[i]
.val=tr[i<<1]
.val+tr[i<<1|
1].val;
}void
down
(int i)
intquery
(int i,
int l,
int r,
int l,
int r)
void
updata
(int i,
int l,
int r,
int l,
int r)
if(l>r || l>r)
return
;down
(i);
int mid=
(l+r)
>>1;
updata
(i<<
1,l,mid,l,r)
;updata
(i<<1|
1,mid+
1,r,l,r)
; tr[i]
.val=tr[i<<1]
.val+tr[i<<1|
1].val;
}void
delet
(int u,
int v)
if(dep[u]
>=dep[v]
)swap
(u,v);if
(num[u]
^num[v]
)updata(1
,1,n,num[u]+1
,num[v]);
}int
ask(
int u,
int v)
if(dep[u]
>=dep[v]
)swap
(u,v)
; ans+
=query(1
,1,n,num[u]
,num[v]);
ans-
=query(1
,1,n,num[u]
,num[u]);
return ans;
}int
main()
;while(~
scanf
("%d"
,&a)
&& a^-1
);if(
!a) mp[
get_hash
(b,c)]=
1;}for
(int i=
1;i<=m;i++
),f[s[i]
.u]=cnt;
e[++cnt]
=edge
,f[s[i]
.v]=cnt;}}
dfs1(1
,0);
dfs2(1
,1);
build(1
,1,n);
for(
int i=
1;i<=m;i++)if
(!mp[
get_hash
(s[i]
.u,s[i]
.v)]
)delet
(s[i]
.u,s[i]
.v);
for(
int i=tot;i>=
1;i--
)for
(int i=
1;i<=tot;i++)if
(q[i]
.op)
printf
("%d\n"
,ans[i]);
}
AHOI2005 航線規劃
給乙個n個點m條邊的圖,有兩種操作 詢問x到y的路徑必經的邊有幾條,刪除x,y之間的直接連邊。1 n 30000,1 m 100000,操作總數不超過40000 我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。必經邊就是橋 ...
P2542 AHOI2005 航線規劃
對 samuel 星球的探險已經取得了非常巨大的成就,於是科學家們將目光投向了 samuel 星球所在的星系 乙個巨大的由千百萬星球構成的 samuel 星系。星際空間站的 samuel ii 巨型計算機經過長期探測,已經鎖定了 samuel 星系中 n 個星球的空間座標,並對這些星球以 1 至 n...
航線規劃 3103
n個星球,m條邊,q個操作。1 破壞一條邊 2 詢問兩個星球之間的關鍵路徑的條數 即為乙個星球到另乙個星球的必經之路 資料範圍 30 n 100,m 500,q 100 60 n 10000,m 30000,q 20000,資料中沒有刪邊操作 100 n 30000,m 100000,q 40000...