nyoj123士兵杀敌4-树状数组-改区间查点
生活随笔
收集整理的這篇文章主要介紹了
nyoj123士兵杀敌4-树状数组-改区间查点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
士兵殺敵(四)
時間限制:2000?ms ?|? 內存限制:65535?KB 難度:5 描述南將軍麾下有百萬精兵,現已知共有M個士兵,編號為1~M,總會有一批編號連在一起人請戰,最終他們獲得相同軍功,軍師小工的任務就是在南將軍詢問他某個人的軍功的時候,快速的報出此人的軍功,請你編寫一個程序來幫助小工吧。起始時所有人的軍功都是0。
輸入每一行是兩個整數T和M表示共有T條指令,M個士兵。(1<=T,M<=1000000)
隨后的T行,每行是一個指令。
指令分為兩種:
ADD 100 500 55 表示,第100個人到第500個人請戰,最終每人獲得了55軍功,每次每人獲得的軍功數不會超過100,不會低于-100。
先記錄一下,日后便于查看。
#include <stdio.h> #include <stdlib.h> int n, C[1000000]; int lowbit(int m) {//得到m二進制最低位的1表示的數 return m&(-m);//如1010,其負數為: 原碼->反碼0101->補碼0111, &得0010 } void update(int i, int add) {while(i <= n) {C[i] += add;i += lowbit(i);//更新 } } int sum(int i) {int s = 0;while(i > 0) {s += C[i];i -= lowbit(i);}return s; } int main() {int m, x, i = 0, j;char str[9];scanf("%d%d", &m, &n);//n = 0;while(m--) {scanf("%s%d", str, &i);if(str[0] == 'A') {scanf("%d%d", &j, &x);update(i,x);update(j+1,-x);}else printf("%d\n", sum(i));}return 0; }
總結
以上是生活随笔為你收集整理的nyoj123士兵杀敌4-树状数组-改区间查点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 缓存穿透、缓存击穿和缓存雪崩实践附源码
- 下一篇: 去Oracle不仅是BAT的事,AWS彻