給定一棵樹,每個結點上有乙個權值,然後給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...