Hdu 1166 敵兵布陣

2021-06-18 08:29:13 字數 1242 閱讀 8262

線段樹  單點更新

線段樹功能:

build 構建線段樹

change 更新單點資訊

query 區間求和

註解:1. a[rt].cnt = a[rt*2].cnt + a[rt*2+1].cnt; 將當前節點的資訊更新到父親節點。

2. 輸入數列時,不直接輸入陣列裡,而是先構建好線段樹,再利用change往裡面新增。

3. 陣列大小50005肯定tle,至少要到50005*4 。

4. 網上有些結題報告中用到位運算:rt*2 = rt<<1 , rt*2+1 = rt<<1|1 , (l+r)/2 = (l+r)>>1 。

ac**:

#include #include #include #include #include using namespace std;

#define maxn 55555

struct segmenttree a[maxn*4];

/*void push_up(int rt)

*/void build(int s, int t, int rt)

a[rt].l = s;

a[rt].r = t;

a[rt].cnt = 0;

int mid = (s+t)/2;

build(s, mid, rt*2);

build(mid+1, t, rt*2+1);

}void change(int i, int j, int rt)

int mid = ((a[rt].l) + (a[rt].r))/2;

if(i<=mid)

else

a[rt].cnt = a[rt*2].cnt + a[rt*2+1].cnt;

//push_up(rt);

}int sum;

void query(int s, int t, int rt)

int mid = ((a[rt].l) + (a[rt].r))/2;

if(t<=mid)

else if(s>mid)

else

}int main()

printf("case %d:\n", ++cnt);

while(scanf("%s", p),strcmp(p,"end"))

else if(p[0] == 's')

else }}

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想知道某段連續的花的美觀值之和是多少...