HDU 1166 敌兵布阵(线段树单点加区间查询)
生活随笔
收集整理的這篇文章主要介紹了
HDU 1166 敌兵布阵(线段树单点加区间查询)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Problem Description C國的死對頭A國這段時間正在進行軍事演習,所以C國間諜頭子Derek和他手下Tidy又開始忙乎了。A國在海岸線沿直線布置了N個工兵營地,Derek和Tidy的任務就是要監視這些工兵營地的活動情況。由于采取了某種先進的監測手段,所以每個工兵營地的人數C國都掌握的一清二楚,每個工兵營地的人數都有可能發生變動,可能增加或減少若干人手,但這些都逃不過C國的監視。
中央情報局要研究敵人究竟演習什么戰術,所以Tidy要隨時向Derek匯報某一段連續的工兵營地一共有多少人,例如Derek問:“Tidy,馬上匯報第3個營地到第10個營地共有多少人!”Tidy就要馬上開始計算這一段的總人數并匯報。但敵兵營地的人數經常變動,而Derek每次詢問的段都不一樣,所以Tidy不得不每次都一個一個營地的去數,很快就精疲力盡了,Derek對Tidy的計算速度越來越不滿:"你個死肥仔,算得這么慢,我炒你魷魚!”Tidy想:“你自己來算算看,這可真是一項累人的工作!我恨不得你炒我魷魚呢!”無奈之下,Tidy只好打電話向計算機專家Windbreaker求救,Windbreaker說:“死肥仔,叫你平時做多點acm題和看多點算法書,現在嘗到苦果了吧!”Tidy說:"我知錯了。。。"但Windbreaker已經掛掉電話了。Tidy很苦惱,這么算他真的會崩潰的,聰明的讀者,你能寫個程序幫他完成這項工作嗎?不過如果你的程序效率不夠高的話,Tidy還是會受到Derek的責罵的.
每組數據第一行一個正整數N(N<=50000),表示敵人有N個工兵營地,接下來有N個正整數,第i個正整數ai代表第i個工兵營地里開始時有ai個人(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條命令
對于每個Query詢問,輸出一個整數并回車,表示詢問的段中的總人數,這個數保持在int以內。
中央情報局要研究敵人究竟演習什么戰術,所以Tidy要隨時向Derek匯報某一段連續的工兵營地一共有多少人,例如Derek問:“Tidy,馬上匯報第3個營地到第10個營地共有多少人!”Tidy就要馬上開始計算這一段的總人數并匯報。但敵兵營地的人數經常變動,而Derek每次詢問的段都不一樣,所以Tidy不得不每次都一個一個營地的去數,很快就精疲力盡了,Derek對Tidy的計算速度越來越不滿:"你個死肥仔,算得這么慢,我炒你魷魚!”Tidy想:“你自己來算算看,這可真是一項累人的工作!我恨不得你炒我魷魚呢!”無奈之下,Tidy只好打電話向計算機專家Windbreaker求救,Windbreaker說:“死肥仔,叫你平時做多點acm題和看多點算法書,現在嘗到苦果了吧!”Tidy說:"我知錯了。。。"但Windbreaker已經掛掉電話了。Tidy很苦惱,這么算他真的會崩潰的,聰明的讀者,你能寫個程序幫他完成這項工作嗎?不過如果你的程序效率不夠高的話,Tidy還是會受到Derek的責罵的.
?
Input 第一行一個整數T,表示有T組數據。每組數據第一行一個正整數N(N<=50000),表示敵人有N個工兵營地,接下來有N個正整數,第i個正整數ai代表第i個工兵營地里開始時有ai個人(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詢問,輸出一個整數并回車,表示詢問的段中的總人數,這個數保持在int以內。
?
Sample Input 1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End?
Sample Output Case 1: 6 33 59?
Author Windbreaker?
Recommend Eddy???|???We have carefully selected several similar problems for you:??1394?1698?1754?1542?1540? #include <cstdio> #include <iostream> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <queue> #include <vector> #include <map> using namespace std;#define ll long long #define eps 1e-9const int inf = 0x3f3f3f3f; const int mod = 1e9+7;ll t, n, a[500000+8], x, y, ans; string s;struct node {ll l, r, sum, plz; }tree[500000+8];void build(ll l, ll r, ll i)///建樹 {tree[i].sum = 0;tree[i].l = l;tree[i].r = r;tree[i].plz = 0;if(l == r)///如果已經是葉子結點,就讓葉子結點等于對應的值 {tree[i].sum = a[l];return;}ll mid = (r+l)/2;build(l, mid, i*2);///如果還不是葉子結點,就往左邊搜索build(mid+1, r, i*2+1);///如果還不是葉子結點,就往左邊搜索tree[i].sum = tree[i*2].sum + tree[i*2+1].sum;///父節點的和等于左兒子的和加右兒子的和 }void pls(ll i, ll pos, ll k)///單點加 {if(tree[i].r == pos && tree[i].l == tree[i].r)///如果已經是要加的那個葉子結點 {tree[i].sum += k;///那就加return;///然后撤退 }ll mid = (tree[i].l + tree[i].r)/2;///如果還不是if(pos <= mid)///看看那個點是不是在左兒子所包含的部分pls(i*2, pos, k);///往左兒子那邊找else///看看那個點是不是在右兒子所包含的部分pls(i*2+1, pos, k);///往右兒子那邊找tree[i].sum = tree[i*2].sum + tree[i*2+1].sum;///一定要記得加這一句,不然就總是數據出錯!! }void search(ll i, ll l, ll r)///區間查找 {if(tree[i].l >= l && tree[i].r <= r)///如果要查找的區間在目的區間內 {ans += tree[i].sum;///那就加上所查找的區間的和return;///然后撤退 }if(tree[i*2].r >= l)///如果要查找的區間在左兒子那邊search(i*2, l, r);///那就找左兒子if(tree[i*2+1].l <= r)///如果要查找的區間在右兒子那邊search(i * 2 + 1, l, r);///那就找右兒子return; }int main() {scanf("%lld", &t);ll miao = t;while(t--){scanf("%lld", &n);for(int i = 1; i <= n; i++)scanf("%lld", &a[i]);build(1, n, 1);printf("Case %lld:\n", miao-t);while(1){ans = 0;cin>>s;if(s == "End")break;else if(s == "Add"){scanf("%lld%lld", &x, &y);pls(1, x, y);}else if(s == "Sub"){scanf("%lld%lld", &x, &y);pls(1, x, -y);}else if(s == "Query"){scanf("%lld%lld", &x, &y);search(1, x, y);printf("%lld\n", ans);}}}return 0; }?
轉載于:https://www.cnblogs.com/RootVount/p/11295819.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的HDU 1166 敌兵布阵(线段树单点加区间查询)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 P3373 【模板】线段树 2(
- 下一篇: 用维基百科训练word2vec中文词向量