HDU 5458(樹鏈剖分)

2021-07-10 06:08:18 字數 2518 閱讀 8268

(

題意:給乙個無向圖,兩種操作,刪除一條邊,詢問兩點之間關鍵路徑的數目。

關鍵路徑,即刪除這條邊,兩點就不聯通了。保證圖一直聯通。

解法:先在最後的圖上跑一顆生成樹。每有一條其他的邊,就對路徑上的所有邊+1。所以就存在兩種操作,對某一段-1,查詢某一段上0的個數,就可以用線段樹做了。

//#pragma comment(linker, "/stack:1024000000,1024000000")

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

#include

#include

//#pragma comment(linker, "/stack:1024000000,1024000000")

using

namespace

std;

#define lson l, m, rt<<1

#define rson m+1, r, rt<<1|1

#define inf 1e9

#define debug(a) cout << #a" = " << (a) << endl;

#define debugarry(a, n) for (int i = 0; i < (n); i++)

#define clr(x, y) memset(x, y, sizeof x)

#define ll long long

#define ull unsigned long long

#define for(i,a,b) \

for(i=a;a=b;aconst

int maxn = 1e5+30;

struct sadg[maxn<<1];

int h[maxn],si;

void add(int u,int v)

int siz[maxn] , dep[maxn];

int fa[maxn] , son[maxn] , top[maxn];

int vis[maxn];

mapint>us;

ll hash(int u,int v)

void dfs1(int u,int f,int d)

}int mi[maxn<<2],rs[maxn<<2],col[maxn<<2];

void pushup(int rt)

void pushdown(int rt)

}void build(int l,int r,int rt)

int m=l+r>>1;

build(lson);

build(rson);

pushup(rt);

}void update(int l,int r,int d,int l,int r,int rt)

pushdown(rt);

int m=l+r>>1;

if( l <= m ) update(l,r,d,lson);

if( m < r ) update(l,r,d,rson);

pushup(rt);

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

int query(int u,int v)

if(u==v) return ret;

if( dep[u] > dep[v] ) swap(u,v);

ret += query(p[son[u]],p[v],1,pos-1,1);

return ret;

}void change(int u,int v,int d)

if(u==v) return ;

if( dep[u] > dep[v] ) swap(u,v);

update(p[son[u]],p[v],d,1,pos-1,1);

}void init()

int a[maxn],b[maxn],c[maxn];

int main()

for(int i=0;iscanf("%d%d%d",&a[i],&b[i],&c[i]);

if(a[i]==1) us[hash(b[i],c[i])]--;

}dfs1(1,-1,1);

dfs2(1,1);

build(1,pos-1,1);

for(int u=1;u<=n;u++)}}

printf("case #%d:\n",++case);

vector

ans;

for(int i=q-1;i>=0;i--)

for(int i=ans.size()-1;i>=0;i--)

printf("%d\n",ans[i]);

}return

0;}

hdu 5458 樹鏈剖分模板

題意 給出一張n個點,m條邊的無向圖,有兩個操作 1.刪除 u,v 間的一條邊 2.如果刪除 u,v 間的一條邊可使其不連通,找出這樣的邊的個數,就是找 u,v 間橋的個數 思路 首先離線這些操作,時光倒流從最終狀態逆著加邊加回原圖,可以考慮用並查集建樹,然後以樹作為最終狀態,再樹鏈剖分預處理下,建...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...

HDU3966 樹鏈剖分

題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...