description
lily 特別喜歡養花,但是由於她的花特別多,所以照料這些花就變得不太容易。她把她的花依次排成一行,每盆花都有乙個美觀值。如果lily把某盆花照料的好的話,這盆花的美觀值就會上公升,如果照料的不好的話,這盆花的美觀值就會下降。有時,lily想知道某段連續的花的美觀值之和是多少,但是,lily的算術不是很好,你能快速地告訴她結果嗎?
input
第一行乙個整數t,表示有t組測試資料。每組測試資料的第一行為乙個正整數n(n<=50000),表示lily有n盆花。接下來有n個正整數,第i個正整數ai表示第i盆花的初始美觀值(1<=ai<=50)。
接下來每行有一條命令,命令有4種形式:
(1)add i j, i和j為正整數,表示第i盆花被照料的好,美觀值增加j(j<=30)
(2)sub i j, i和j為正整數,表示第i盆花被照料的不好,美觀值減少j(j<=30)
(3)query i j, i和j為正整數,i<=j,表示詢問第i盆花到第j盆花的美觀值之和
(4)end,表示結束,這條命令在每組資料最後出現
每組資料的命令不超過40000條
output
對於第i組資料,首先輸出"case i:"和回車。對於每個"query i j"命令,輸出第i盆花到第j盆花的美觀值之和。
sample input19
7 9 8 4 4 5 4 2 7
query 7 9
add 4 9
query 3 6
sub 9 6
sub 3 3
query 1 9
end
sample output
case 1:
133050
這個題算是樹狀樹組入門題吧,操作比較簡單,只有修改和求和操作。
不懂樹狀樹組的看看大神的部落格吧:
強烈推薦看懂那圖和位運算。
langauge:c++
code:
#include#includeconst int maxn=50004;
int n,a[maxn];
char s[12];
void add(int x,int w)
int sum(int x)
int main()
printf("case %d:\n",k);
while(scanf("%s",s))
} }
return 0;
}
#include#includeusing namespace std;
int tree[200005];
void build(int left,int right,int root)
else
}void update(int p,int add,int left,int right,int root)
else
}int query(int x,int y,int left,int right,int root)
else
}int main()
}return 0;
}
hdu 1166 敵兵布陣
這是一道線段樹里最簡單的一類題目了,單點更新型別!include define lson l m rt 1 define rson m 1 r rt 1 1 const int maxx 55555 int sum maxx 2 void pushup int rt void build int l...
hdu 1166 敵兵布陣
線段樹的模版 沒什麼思想 include include include include include include include include include include include include include define ll long long define vi vec...
HDU 1166 敵兵布陣
複習線段樹,把notonlysuccess上面的推薦題目都刷一遍。需求 單點更新,區間求和。include include include include include include include include include include include include include ...