HDU 4718(樹鏈剖分)

2021-07-10 06:08:18 字數 2215 閱讀 9375

(

題意:一棵樹,點權值,q詢問,詢問a到b的路徑上最長的一段上公升序列。

解法:樹鏈剖分點操作,是帶方向的,並且必須是a到b,不能是b到a。

//#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;astruct sad

sad(int v)

sad operator +(const sad &b)const

c.ans2 = max(ans2,b.ans2);

c.l2 = l2;

c.r2 = b.r2;

if( vr > b.vl )

return c;

}sad rev()

};const

int maxn = 1e5+30;

struct edheg[maxn<<1];

int h[maxn],si;

void add(int u,int v)

int siz[maxn],dep[maxn];

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

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

}int val[maxn];

sad rs[maxn<<2];

void pushup(int rt)

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

int m=l+r>>1;

build(lson);

build(rson);

pushup(rt);

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

int query(int u,int v)

// printf("f1 %d u %d\n",f1,u);

ans1 = query(p[f1],p[u],1,pos-1,1) + ans1;

u=fa[f1];

f1=top[u];

}if( dep[u] > dep[v] )

// printf("v %d u %d\n",v,u);

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

sad ans = ans1.rev() +ans2;

if(!r) return ans.ans1;

else

return ans.ans2;

}void init()

int main()

dfs1(1,-1,1);

dfs2(1,1);

build(1,pos-1,1);

scanf("%d",&q);

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

for(int i=0;iscanf("%d%d",&u,&v);

printf("%d\n",query(u,v));}}

return

0;}

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 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的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...

hdu5029 樹鏈剖分

這題絕對好題。題意很簡單,也很容易想到樹鏈剖分,之後就不太好做了。開始想的是按顏色排序,然後每次處理一種顏色,求出最優解。這樣做的話,最壞情況會退化到n 2,不可接受。之後用線段樹維護,乙個節點只存在一種顏色,而且排序之後能保證在樹中顏色不會交叉,pushdown的時候可以將兩種都不是當前正在處理的...