樹鏈剖分 hdu5221 Occupation

2021-07-04 11:58:15 字數 1938 閱讀 8167

給定一棵樹,每個結點上有乙個權值,然後給q個操作,每個操作為:1. 占領這個樹上兩個結點路徑上的所有結點,包括起點和終點;2. 取消某個結點的占領; 3. 占領以某個結點為根的整棵子樹; 對於每個操作,返回完成這個操作後整棵樹被占領結點的權值之和

在操作線段樹時,區間更新需要打懶標記,不然會超時

#include#include#include#include#include#include#include#include#include#include#include#include#pragma comment(linker, "/stack:102400000,102400000")//c++

using namespace std;

const double pi = 3.141592653589793238462643383279502884197169399;

const int maxint = 0x7fffffff;

const int maxsize = 100000 + 5;

int n,q;

int fa[maxsize], siz[maxsize], son[maxsize], dep[maxsize], top[maxsize], tid[maxsize], sontree[maxsize], ptid[maxsize], w[maxsize];

int first[maxsize], gnext[2*maxsize], to[2*maxsize], edge;

int tsum;

int ans;

void dfs_1(int v,int father,int depth)

i = gnext[i];

}return;

}void dfs_2(int v, int tp)

int i=first[v];

while (i)

i = gnext[i];

}return ;

}struct node

};node tree[(maxsize << 2) + 5];

//初始狀態 buildtree(0,1,n)

void buildtree(int root, int l, int r)

else

return;

}//更新節點 (0,i,w)

void t_insert(int root, int i)

else

if (i <= tree[root].mid())

t_insert(root * 2 + 1, i);

else

t_insert(root * 2 + 2, i);

tree[root].sum = tree[(root<<1)+1].sum + tree[(root<<1)+2].sum; }}

//更新線段[st,en] (0,st,en,w)

void t_update(int root, int st, int en)

if (st > tree[root].mid())

t_update(root * 2 + 2, st, en);

else if (en <= tree[root].mid())

t_update(root * 2 + 1, st, en);

else

tree[root].sum = tree[(root<<1) + 1].sum + tree[(root<<1) + 2].sum;

return;

}void g_insert(int a, int b)

void init()

int main()

else

}else if (a==2)

else

ans=tree[0].sum;

printf("%d\n",ans);}}

return 0;

}

HDU5221 Occupation 樹鏈剖分

題意 給出一棵樹,root 1,樹有點權,有乙個人叫做m 有3種操作 1 u v 把u到v路徑上的所有點的點權都給m 2 u 若u的點權在m手上,拿走 3 u 把u為根的子樹的所有點權都給m 每乙個操作過後,輸出m擁有的點權 想法 要維護路徑,用樹鏈剖分 要維護子樹,用dfs序 但是這樣貌似要寫很多...

Occupation hdu5221 樹鏈剖分

題意 一開始有n個點 且每個點有其價值 有三個操作 1 選取路徑 x y 並獲得其價值 2 刪除x的價值 也就是放棄x 如果x未選擇就不用刪除 3 選取x及x的子樹 每次詢問都要輸出獲得的價值總和 三個操作都很簡單 主要是是線段樹有一點不一樣 用字首和可以解決 見 includeusing name...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 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...