題目大意:對於乙個有根樹有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老師說 邏輯電路是一種離散訊號的傳遞和處理 以二進位制為原理 實現數碼訊號邏輯運算和操作的電路。分組合邏輯電路和時序邏輯...