背景
小h同學的妹子實在是太多辣,多的他又種下了一顆妹子樹。
描述樹上有n個妹子,兩兩之間有且僅有一條路徑。
小h每次想泡兩個妹子,但是妹子是一種奇怪的生物(霧),小h無論想泡哪一對妹子,都得為她們路徑上的所有妹子支付軟妹幣(p.s.泡乙個不就好了)。
這次我們的妹子樹形態不會變了,但是她們需要的軟妹幣會變化。
小h很苦惱,他需要知道每一次泡妹子需要多少預算,他請求了小y,小y當然會辣,他想考考你。
支援兩種操作:
q u v 詢問泡u和v的價值
c u v改變u的權值為v
格式輸入格式
輸入檔案第一行是乙個整數n,表示n個妹子,從1開始編號。
輸入檔案第二行是n個正整數vi,表示每個妹子的初始所需軟妹幣。
接下來n-1行,每行兩個整數u和v,表示u和v有一條邊。
然後是乙個整數m,一共m此操作
接下來m上格式如上。
輸出格式
對於每一次詢問操作,你需要輸出乙個整數,表示所需的軟妹幣,每行乙個答案。
樣例1樣例輸入1
312
3122
35q 12
q 13c2
3c35
q 13
樣例輸出1
3
69
限制
對於前20%的資料,滿足1<=n<=300,1<=m<=500
對於前60%的資料,滿足1<=n<=3000,1<=m<=5000
對於20%的資料,是一條鏈
對於前50%的資料,保證是完全隨機
對於前80%的資料,滿足1<=n<=30000,1<=m<=50000
對於100%的資料,滿足1<=n<=100000,1<=m<=200000,1<=vi<=1000
樹剖+線段樹
#include
using namespace std;
int n,tot,t,sz;
int lnk[100005],w[100005],size[100005],fa[100005],dep[100005],ft[100005],pos[100005],top[100005];
struct edge
e[200005];
struct tree
tr[300005];
int readln()
void add(int
x,int
y)void dfs1(intx)}
void dfs2(int
x,int to)
if (k==0) return;
dfs2(k,to);
for (int i=lnk[x];i;i=e[i].nxt)
}void build(int l,int r,int rt)
int mid=(l+r)>>1;
build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);
tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
}void change(int
x,int
y,int rt)
int mid=(l+r)>>1;
if (x
<=mid) change(x,y,rt<<1); else change(x,y,rt<<1|1);
tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
}int query(int l,int r,int rt)
void sort(int &x,int &y)
int solveq(int x,int y)
if (pos[x]>pos[y]) sort(x,y);
ret+=query(pos[x],pos[y],1);
return ret;
}int main()
return
0; }
VIJOS1986 小h的妹子樹二
給定一棵有n個節點的樹 n 10 5 需要支援2種操作 q u v 詢問從u到v路徑上所有點的權值和 c u v 改變u的權值為v 操作次數m 2 10 5 無腦樹鏈剖分,然後直接用bit維護就可以了 但是這題的操作比較簡單,使用樹鏈剖分太大才小用了.樹鏈剖分,顧名思義,將樹上的鏈進行適當的剖分使得...
Vijos P1391 想越獄的小杉
背景 這次小杉來到了經典美劇 越獄 的場景裡 他被抓起來了 幹嘛幻想這麼鬱悶的場景 小杉身為新一代的scofield,在挖了半個月之後終於挖通牢房裡的地道。在地道裡,無數的管道路線困惑了他。若對情節有任何疑問,請 原劇 描述小杉看了看自己的紋身,明白了整個管道網是由n個小房間和若干小房間之間的單向的...
小H的詢問(線段樹)
線段樹需要維護的 最大有效子區間權值和,左端最大有效子區間權值和,右端最大有效子區間權值和,區間和,本區間有效性。include include include include include include include define maxn 1000005 using namespace s...