直接求超時。用線段樹。簡單做法直接用2n陣列,以1為root,2*i為左節點,2*i+1為右節點。
求區間[a,b]和時,如果a為右節點,則減去左節點的值。如果b為左節點,則減去右節點的值。a,b迭代為自己的父母。當a,b相等時,加上當前節點的值,即為區間和。
我也是第一次接觸線段樹的概念。剛開始也想自己建立一棵樹。在網上找到了張昆瑋的線段樹的講稿,才發現可以直接用陣列。分享下:
#include usingnamespace
std;
int s[131072
];int
main()
sta=1
for(i=sta;i)
cin>>s[i];
end=sta*2
;
for(;i)
s[i]=0
; sta--;
for(i=sta;i;i--)
s[i]=s[t=2*i]+s[t+1
];
while(scanf("
%s",str) && str[0]!='e'
)
printf(
"%d\n
",sum+s[m]);
}else}}
}}
個人感覺**不是很好看。還有就是不能用cin和cout,會超時。
杭電 1166 敵兵布陣 (線段樹)
c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工兵營地的人數都有可能發生...
杭電oj 1166 敵兵布陣(線段樹裸題)
題目鏈結 線段樹保留了二叉樹的結構特點,能夠在o log n o l og n 的時間內查詢一些區間的資訊,比如區間和,區間最大最小值,而且還支援資料更改。include using namespace std const int n 2e6 100 struct nodenode n 2 int ...
杭電1166 線段樹(單點更新)
線段樹只是acm眾多演算法中的很普遍的一種,但是他的效率非常高,一般演算法複雜度為o n 的題,通過線段樹之後,就會變成o log2 n 本文是以杭電acm1166題舉例,來對線段樹進行一些了解 杭電1166原題鏈結 比如說求5到12的總人數,用線段樹的話,你只要找到 5,7 8,10 11,12 ...