線段樹的模版 沒什麼思想
#include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long
#define vi vector#define si set#define readf freopen("input.txt","r",stdin)
#define writef freopen("output.txt","w",stdout)
#define fu(i,a) for(int i(1); i <= (a); i++)
#define fd(i,a) for(int i(a); i >= (1); i--)
#define for(i,a,b) for(int i(a);i <= (b); i++)
#define ford(i,a,b) for(int i(a);i >= (b); i--)
#define set(a,b) memset(a,b,sizeof(a))
#define sd(a) scanf("%d",&(a))
#define ln printf("\n")
#define ps printf(" ")
#define pb push_back
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
const int maxn = 222222;
int value[maxn>>2],n;
struct nodetree[maxn];// a為線段的左端點,b為右端點,sum即為這個怎麼說....和!
void buildtree(int a,int b,int k)
int mid=(a+b)>>1; //裝b利器 位運算! 其實就是除以2
buildtree(a,mid,k<<1); //裝b利器 位運算! 其實就是乘以2
buildtree(mid+1,b,k<<1|1) ; //裝b利器 位運算! 其實就是乘以2+1;
tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum; //先建樹後統計,所以寫在後面
}// k為根結點,a為左端點,b為右端點
void update(int a,int val,int k)//只有到了跟結點才會更新此點的值
if(a <= tree[k<<1].b )
update(a,val,k<<1);
else
update(a,val,k<<1|1);
tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;//不要忘記將所有父節點什麼的更新
}//應該每次都從根節點開始找吧..~~
int query(int x,int y,int k)
}int main()
}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 敵兵布陣
description lily 特別喜歡養花,但是由於她的花特別多,所以照料這些花就變得不太容易。她把她的花依次排成一行,每盆花都有乙個美觀值。如果lily把某盆花照料的好的話,這盆花的美觀值就會上公升,如果照料的不好的話,這盆花的美觀值就會下降。有時,lily想知道某段連續的花的美觀值之和是多少...
HDU 1166 敵兵布陣
複習線段樹,把notonlysuccess上面的推薦題目都刷一遍。需求 單點更新,區間求和。include include include include include include include include include include include include include ...