這題是我第一次自己查錯並且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後,最大值就可以直接根據最小值得到,當然,延遲...