題目大意:有一些塔, 規定li, ri , di 表示殺傷力,塔在同乙個格仔只能攻擊同乙個怪獸一次, 怪獸從初始位置跑到n的位置,問有多少怪獸能夠活著;
(吐槽)一看題, 果斷線段樹送分題, 然而被騙了,o(nlogn)的演算法很難過去, 跟新的次數和查詢的次數太多了, 不過有的人用線段樹加加速輸入險過,至少我的不行; (然後,翻題解翻題解),有o(n)的演算法,難怪作者卡線段樹了;
分析:陣列的巧妙用法, 類似線段樹延遲標記的思想, 建立乙個陣列att , 乙個塔li , ri, di ; att[li]+=di; att[ri+1] -=di; 有什麼好處呢? 從左到右執行att[i] += att[i-1]; 就可以得到每個格仔的攻擊力, 這樣模擬的可以記錄下所有的值,然後直接處理最終的答案; 最後從後向前掃一次就可以求出每個格仔到結束的總攻擊力;
#include #include #include #include using namespace std;
const int maxn = 100000+10;
int n, m;
long long att[maxn];
int main()
for(int i = 2; i <= n; ++i) att[i] += att[i-1];
for(int i = n-1; i >= 1; --i) att[i] += att[i+1];
long long h, x;
int k, ans = 0;
scanf("%d", &k);
for(int i = 0; i < n; ++i)
printf("%d\n", ans);
}return 0;
}
HDU 4970樹狀陣列
差分法 作用 計算某個區間的和 步驟 1 建立cha,然後在要改變值的區間 a,b 上,cha a c,ch b c 2.從前往後 for int i 1 i n i cha i cha i 1 由前面2步,就可以得到此時i上的每個值 3 再計算sum,走到當前的sum 4 這時就可以用sum b ...
hdu 4970 樹狀陣列 「改段求段」
題意 塔防。給1 n,給出m個塔,每個塔有攻擊力,給出k個怪獸的位子和血量,問有幾隻可以到達n點。今天剛剛複習了樹狀陣列,就碰到這個題,區間更新 區間求和型別。第三類樹狀陣列可以斬。注意一下大數即可。include include includeusing namespace std int64 t...
hdu 4970 樹狀陣列 「改段求段」
題意 塔防。給1 n,給出m個塔,每個塔有攻擊力,給出k個怪獸的位子和血量,問有幾隻可以到達n點。今天剛剛複習了樹狀陣列,就碰到這個題,區間更新 區間求和型別。第三類樹狀陣列可以斬。注意一下大數即可。include include includeusing namespace std int64 t...