AHOI2005 航線規劃

2021-09-26 04:26:31 字數 3921 閱讀 4202

點此看題

題意:略

說明/提示

我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。

資料範圍

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...