time limit:4000ms
memory limit:65536k
total submissions:16709
accepted:4561
description
input
output
for each message a, print an integer x, the time required to take the next child.
sample input
3 3 1sample output1 2 1
2 3 2
0 21 2 3
0 3
1題意:給一棵樹,樹的邊有邊權。有兩種操作,詢問乙個位置到另乙個位置的路徑長度,或是更改第 i 條邊的邊權。3
思路:樹剖邊權模版題。。 相對於點權,是把邊權放在 深度較深的那個點,然後跑點權的樹剖,唯一不同的是,在利用重鏈的函式裡面,在最後的時候需要先判斷 x 與 y 是否是同一點,然後把 深度淺的那個點移向他的重兒子。
code:
#include#include#include#define debug(x) cout << "[" << #x <<": " << (x) <<"]"<< endl
#define pii pair#define clr(a,b) memset((a),b,sizeof(a))
#define rep(i,a,b) for(int i = a;i < b;i ++)
#define pb push_back
#define mp make_pair
#define ll long long
#define ull unsigned ll
#define ls i << 1
#define rs (i << 1) + 1
#define int(t) int t; scanf("%d",&t)
using namespace std;
const int maxn = 1e6 + 10;
int head[maxn],cnt = 0;
struct xx;
}edge[maxn << 1];
int hson[maxn],dep[maxn],size[maxn];
int fa[maxn],dfsx[maxn],rk[maxn];
int top[maxn],val[maxn];
///先dfs1,再dfs2, 如根節點為 r, 則 dfs1(r,0); dfs2(r,r);
void dfs1(int p,int f)
}int xu = 0;
void dfs2(int p,int tp)
}ll sum[maxn << 2];
ll query(int i,int l,int r,int ql,int qr)
ll ans = 0;
int mid = (l + r) >> 1;
if(ql <= mid) ans += query(ls,l,mid,ql,qr);
if(qr > mid) ans += query(rs,mid + 1,r,ql,qr);
return ans;
}ll allquery(int x,int y)
if(x == y) return ans;
if(rk[x] > rk[y]) swap(x,y);
ans += query(1,1,xu,rk[hson[x]],rk[y]);
return ans;
}void update(int i,int l,int r,int pos,int val)
int mid = (l + r) >> 1;
if(pos <= mid) update(ls,l,mid,pos,val);
if(pos > mid) update(rs,mid + 1,r,pos,val);
sum[i] = sum[ls] + sum[rs];
}void init(int n)
int main()
dfs1(s,0); dfs2(s,s);
for(int i = 1;i < cnt;++ i)
while(q --)
else }}
return 0;
}
POJ2763 樹鏈剖分,邊權,模板)
題意 給定乙個樹形圖,某人原來在 s 點,每條邊 路 有通過的時間花費,有兩種操作 1.查詢某人到 u 點花費的時間 2.更新某條路的時間花費。解題思路 前面樹鏈剖分練得一直是點權,但一遇邊權懵逼了。下裡面的 是從點權改過來的。其實邊權和點權是差不多的。大致意思就是,取每條邊連個點中,處於下位的 更...
POJ 2763 樹鏈剖分 邊修改 邊查詢)
解題思路 樹鏈剖分基礎題。每次q之後改變一下s。線段樹記錄的是邊權。方法是對於一條邊 u,v 邊權值加在dep比較大的那一端。鏈查詢 邊 和 鏈查詢 點 在輕鏈時略有不同。注意本題使用vector鄰接表存圖是會tle的,應該使用鏈式前向星。樹鏈剖分中使用鏈式前向星是基本要求。include cstd...
POJ 2763 樹鏈剖分 線段樹維護區間和
這題是我第一次自己查錯並且a掉的樹剖模板題。思路很簡單,樹剖後扔到線段樹里就行了。唯一困難點的是 1.題目給的是邊權值,要轉為點值,那麼直接把值賦給連線邊的兩點中深度較大的一點 2.修改時,是給編號修改,為了方便,我直接開的幾個陣列來裝邊上的資訊 查了半天錯,結果是線段樹打錯了個字母。ac 如下 i...