POJ 2763 樹鏈剖分 線段樹維護區間和

2021-07-30 12:42:44 字數 1234 閱讀 6772

這題是我第一次自己查錯並且a掉的樹剖模板題。

思路很簡單,樹剖後扔到線段樹里就行了。

唯一困難點的是

1.題目給的是邊權值,要轉為點值,那麼直接把值賦給連線邊的兩點中深度較大的一點

2.修改時,是給編號修改,為了方便,我直接開的幾個陣列來裝邊上的資訊

//查了半天錯,結果是線段樹打錯了個字母。。。

ac**如下

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

#define inf 200100

using namespace std;

struct databian[inf*2];

struct nodetr[inf*4];

int n,q,s;

int cnt=0,siz[inf],son[inf],fa[inf],id[inf],top[inf],fanid[inf],deep[inf];

int size,first[inf],a[inf];

bool vis[inf];

int from[inf],too[inf],len[inf],pos,val;

int test,to;

void add(int x,int y,int z)

void init()

void dfs1(int u,int last)

void modify(int k,int pos,int val)

int mid=tr[k].l+tr[k].r>>1;

if(pos<=mid)modify(k<<1,pos,val);

else modify(k<<1|1,pos,val);

update(k);

}int query(int k,int s,int t)

int solvequery(int x,int y)

int main()

{// freopen("in.in","r",stdin);

while(scanf("%d%d%d",&n,&q,&s)!=eof)

{ for(int i=1;i

POJ2763 樹鏈剖分,邊權,模板)

題意 給定乙個樹形圖,某人原來在 s 點,每條邊 路 有通過的時間花費,有兩種操作 1.查詢某人到 u 點花費的時間 2.更新某條路的時間花費。解題思路 前面樹鏈剖分練得一直是點權,但一遇邊權懵逼了。下裡面的 是從點權改過來的。其實邊權和點權是差不多的。大致意思就是,取每條邊連個點中,處於下位的 更...

poj 3237 樹鏈剖分 線段樹

題意 給一棵樹,三種操作。將第i條邊的權值改為v,將a到b的路徑上的邊的權值全部取反,求a到b路徑上邊的權值的最大值。思路 明顯的樹鏈剖分,加上線段樹的操作。因為有取反的操作所以每個區間要記錄最大值和最小值。查詢兩點間的路徑時,用求公共祖先的方式去求。include include includec...

poj 3237 樹鏈剖分 線段樹

題意就是給你一棵樹,每條邊上都有權值,有三種操作,把某條邊的權值變成v,把點a到點b之間的路徑上的邊的權值都乘上 1,求a到b的路徑上的最大值。其實這題的線段樹要比樹鏈剖分難寫,首先,因為有乘 1的操作,所以不光要維護最大值,還要維護最小值,這樣在乘 1後,最大值就可以直接根據最小值得到,當然,延遲...