AHOI2005 航線規劃

2022-08-01 17:45:13 字數 2716 閱讀 6579

給乙個n個點m條邊的圖,有兩種操作:詢問x到y的路徑必經的邊有幾條,刪除x,y之間的直接連邊。

1< n < 30000,1 < m < 100000,操作總數不超過40000

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

必經邊就是橋(刪去x,y不連通那種),但是不好維護。因為無論什麼時候兩點連通,所以考慮特殊情況:一棵樹,樹邊都是必經邊,考慮加邊會帶來什麼影響,會導致樹上x到y的路徑都不是必經邊,當然加進來的邊也不是。所以就很好維護了,考慮時光倒流,先用沒摧毀的邊建一棵樹,加邊就是路徑修改,查詢就是路徑查詢,用樹剖就可以了。那些沒摧毀的非樹邊就按照路徑修改加進來就可以了。

找摧毀的是哪條邊有點噁心(也有可能我寫的方法不對),看見有用hash的。

還有就是因為是路徑,所以把值賦給兒子節點的話,查詢和修改時最後應該是id[x]+1

#includeusing

namespace

std;

const

int maxn=40005

;const

int maxm=100005

;int

n,m,cnt,num;

intfa[maxn];

bool broken[maxm];//

broken 1:沒用到的沒炸的邊

intdep[maxn],size[maxn],son[maxn],id[maxn],top[maxn];

int root,ls[maxn<<1],rs[maxn<<1],sum[maxn<<1

];int

tot,ans[maxn];

vector

cx[maxn];

struct

edgee[maxm];

struct

questionq[maxn];

template

inline void read(t &x)

while(isdigit(ch))

x= f ? -x : x ;

}bool

cmp(edge a,edge b)

bool

cmp1(question a,question b)

bool

cmp2(question a,question b)

int find(int

x)void connect(int x,int y,int

i)

else broken[i]=true;}

void dfs(intu)}

void dfs(int u,int

tp)}

void update(int

rt)void build(int &rt,int l,int

r)

int mid=(l+r)>>1

; build(ls[rt],l,mid);

build(rs[rt],mid+1

,r);

update(rt);

}void modify(int rt,int l,int r,int a_l,int

a_r)

int mid=(l+r)>>1;

if(a_l<=mid) modify(ls[rt],l,mid,a_l,a_r);

if(mid1

,r,a_l,a_r);

update(rt);

}void modify(int x,int

y)

if(dep[x]>dep[y]) swap(x,y);

modify(

1,1,n,id[x]+1

,id[y]);

}int query(int rt,int l,int r,int a_l,int

a_r)

int query(int x,int

y)

if(dep[x]>dep[y]) swap(x,y);

ret+=query(1,1,n,id[x]+1

,id[y]);

return

ret;

}int

main()

while(1

) read(q[cnt].x);

read(q[cnt].y);

q[cnt].id=cnt;

if(q[cnt].x>q[cnt].y) swap(q[cnt].x,q[cnt].y);

} sort(e+1,e+m+1

,cmp);

sort(q+1,q+cnt+1

,cmp1);

for(int i=1,j=1;;j++)

memset(fa,

0,sizeof

(fa));

dep[

1]=1

; dfs(1);

dfs(

1,1);

num=0

; build(root,

1,n);

for(int i=1;i<=m;i++)

if(broken[i]) modify(e[i].x,e[i].y);

sort(q+1,q+cnt+1

,cmp2);

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

for(int i=tot;i;i--) printf("

%d\n

",ans[i]);

}

view code

AHOI2005 航線規劃

點此看題 題意 略 說明 提示 我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。資料範圍 1 n 30000,1 m 100000,1 q 40000 1 leq n leq 30000,1 leq m leq 100000...

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