給乙個n個點m條邊的圖,有兩種操作:詢問x到y的路徑必經的邊有幾條,刪除x,y之間的直接連邊。
1< n < 30000,1 < m < 100000,操作總數不超過40000
我們保證無論航線如何被破壞,任意時刻任意兩個星球都能夠相互到達。在整個資料中,任意兩個星球之間最多隻可能存在一條直接的航線。
必經邊就是橋(刪去x,y不連通那種),但是不好維護。因為無論什麼時候兩點連通,所以考慮特殊情況:一棵樹,樹邊都是必經邊,考慮加邊會帶來什麼影響,會導致樹上x到y的路徑都不是必經邊,當然加進來的邊也不是。所以就很好維護了,考慮時光倒流,先用沒摧毀的邊建一棵樹,加邊就是路徑修改,查詢就是路徑查詢,用樹剖就可以了。那些沒摧毀的非樹邊就按照路徑修改加進來就可以了。
找摧毀的是哪條邊有點噁心(也有可能我寫的方法不對),看見有用hash的。
還有就是因為是路徑,所以把值賦給兒子節點的話,查詢和修改時最後應該是id[x]+1
#includeusingview codenamespace
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]);
}
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...