洛谷U3981 語文 DFS序 線段樹

2021-07-16 08:39:18 字數 1416 閱讀 2015

題目大意:對於乙個有根樹有n個結點,每個結點上都有權值。一共有q次操作,分別為以下兩種:

1.將以結點i為根的子樹除i之外的點的重要度增加delta

2.詢問當前點重要度。

資料範圍:n<=5*10^5,q<=10^6,delta<=10^3

對於30%的資料n<=500,q<=1000.

對於30%的資料,直接模擬在樹上的修改即可,最壞情況單次修改達到o(n)

本題中,要修改一棵子樹上的所有值,於是想到與區間有關的問題。如何把樹轉為區間呢?可以先預處理,dfs遍歷這棵樹,記錄遍歷序,這樣就轉成區間了。因為要修改子樹上的值,於是可以記錄入棧序,這樣處理就可以把乙個結點子樹變成一段連續的區間。區間修改單點查詢用樹狀陣列或線段樹均可。

#include 

#include

using

namespace

std;

struct edgee[500010];

struct segment_treest[2000010];

struct nodea[500010];

int n,fir[500010],m,sta[500010],top,pa[500010];

void init(int,int,int);

void dfs(int);

int query(int,int);

void push_down(int);

void change(int,int,int,int);

int root(int);

int main()

dfs(1);

init(1,1,n);

while(m--)

else

}fclose(stdin); fclose(stdout);

return0;}

void init(int x,int l,int r)

int mid=(l+r)>>1;

init(x<<1,l,mid); init((x<<1)+1,mid+1,r);

return ;

}void dfs(int x)

int query(int x,int pos)

void push_down(int x)

void change(int x,int l,int r,int v)

int mid=(st[x].l+st[x].r)>>1;

if(r<=mid) change(x<<1,l,r,v);

else

if(l>mid) change((x<<1)+1,l,r,v);

else change(x<<1,l,mid,v),change((x<<1)+1,mid+1,r,v);

return;

}int root(int x)

洛谷 P2367 語文成績

洛谷傳送門 語文考試結束了,成績還是一如既往地有問題。語文老師總是寫錯成績,所以當她修改成績的時候,總是累得不行。她總是要一遍遍地給某些同學增加分數,又要注意最低分是多少。你能幫幫她嗎?這又跟神器有什麼關係呢?神說 呵呵。因為n和p的範圍比較大 建議c 選手使用scanf讀入.同時建議寫讀入優化.最...

洛谷 U6931 燈光

明天就是校園活動了,小明作為場地的負責人,將一切都布置好了。但是在活動的前幾天,校園裡的燈卻都壞掉了,無奈之下,只好再去買一批燈。但是很遺憾的是,廠家看馬上要過年了,就沒有在進貨了,現在只剩下n個發光值不同的燈,作為負責人,你需要,想辦法配出合適的燈。廠家有n盞剩下的燈,小明需要m盞燈,因為活動舉辦...

洛谷 U141384 電路

洛谷傳送門 seawayseawa y是熱愛學習的好孩子。有一天,seawayseawa y正在向他的物理老師lsplsp討教物理。ll老師向他介紹了一種神奇的電路,邏輯電路 ll老師說 邏輯電路是一種離散訊號的傳遞和處理 以二進位制為原理 實現數碼訊號邏輯運算和操作的電路。分組合邏輯電路和時序邏輯...