二. 題目大意:簡化為模型為:給乙個區間,區間上每個數可看做容器,對容器有增加,減少,查詢3種操作。增加減少只針對乙個容器,查詢可以多個容器連在一起。每次查詢輸出查詢區間共放有多少東西。
三. 解題思路:暴力肯定超時(50000*40000)。線段樹,最基礎的單點更新。線段樹,也就是區間樹,樹的每個節點代表乙個區間,根節點代表最大的區間[0, n],左子樹代表[0, mid],右子樹代表[mid+1, r],以此類推。每個節點增加乙個域代表當前區間共有多少士兵。然後就是線段樹基本操作,建立樹,單點更新,查詢。
四. **:
#include #include #include using namespace std;
const int max_n = 50010,
inf = 0x3f3f3f3f;
#define lc(t) t<<1
#define rc(t) t<<1|1
struct node
;node setree[4*max_n];
void build(int l, int r, int idx)
void add(int idx, int pos, int num)
}int query(int l, int r, int idx)
}int main()
while(~scanf("%s", command))}}
return 0;
}
法二:樹狀陣列,由於每個整數都可以表示為2的冪次方的和,所以如果對於當前數son,定義father = son+2^k,其中k為son轉化為二進位制之後末尾0的個數,這樣在整數集上剛好存在一一對應的關係。樹的每個節點表示從1到該節點對於的值的和。乙個樹狀陣列只能單點更新和求字首和。
#include #include using namespace std;
const int max_n = 50500;
const int inf = 0x3f3f3f3f;
int tree[max_n], n;
int lowbit(int x)
void update(int pos, int ele)
}int query(int pos)
return res;
}int main()
while(~scanf("%s", str) && str[0]!='e')}}
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 敵兵布陣
description lily 特別喜歡養花,但是由於她的花特別多,所以照料這些花就變得不太容易。她把她的花依次排成一行,每盆花都有乙個美觀值。如果lily把某盆花照料的好的話,這盆花的美觀值就會上公升,如果照料的不好的話,這盆花的美觀值就會下降。有時,lily想知道某段連續的花的美觀值之和是多少...