1. hdu 1166 敵兵布陣
單點更新,區間求和,最裸的線段樹
#include #include #include using namespace std;
#define maxn 50010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct treetree[maxn<<2];
void pushup(int rt)
void build(int l,int r,int rt)
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}void update(int pos,int val,int rt)
int m=(l+r)>>1;
if(pos<=m) update(pos,val,rt<<1);
else update(pos,val,rt<<1|1);
pushup(rt);
}int query(int x,int y,int rt)
int m=(l+r)>>1;
int ans=0;
if(y<=m) ans+=query(x,y,rt<<1);
else if(mhdu 1754 i hate it
單點更新,區間求最值,裸線段樹
#include #include #include #include #include using namespace std;
#define maxn 200010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define inf 1<<31
struct treetree[maxn<<2];
void pushup(int rt)
void build(int l,int r,int rt)
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}void update(int pos,int var,int rt)
int m=(l+r)>>1;
if(pos<=m) update(pos,var,rt<<1);
else update(pos,var,rt<<1|1);
pushup(rt);
}int query(int x,int y,int rt)
int m=(l+r)>>1;
int ans=-inf;
if(x<=m) ans=max(ans,query(x,min(m,y),rt<<1));
if(m3. hdu 1394 minimum inversion number
求滾動之後,逆序對最少的對數,建乙個節點值為0的線段樹,每次插進去乙個數之後,更新比他大的節點全部加1
#include #include #include #include #include using namespace std;
#define maxn 5050
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct treetree[maxn];
int num[maxn];
void pushup(int rt)
void build(int l,int r,int rt)
void update(int pos,int rt)
int query(int x,int y,int rt)
int ans=0;
int m=(l+r)>>1;
if(y<=m) ans+=query(x,y,rt<<1);
else if(m
4. hdu 2795 billboard
廣告牌,每層至多放總寬為w的廣告,每次放的時候優先考慮最上面最左邊的位置,問每次放的位置的排數,不能放輸出-1
線段樹初始值維護乙個最大值,對於當前節點,能放就放然後節點值減小val,並更新到父親節點。
#include #include #include #include #include using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 200010
struct treetree[maxn<<2];
int h,w,n;
void pushup(int rt)
void build(int l,int r,int rt)
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}int query(int val,int rt)
int main()
}return 0;
}
5. cf 197div2 d. xenia and bit operations
題意:求一排數字的位運算的結果,建好樹之後從下往上,異或和或交替運算。
思路:距離葉子節點距離為奇數的節點操作為異或更新,距離為偶數的為或操作更新。
#include #include #include #include #include using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn (1<<17)
struct treetree[(maxn<<2)+1];
void pushup(int rt)
void build(int l,int r,int rt)
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}void update(int pos,int val,int rt)
int m=(l+r)>>1;
if(pos<=m) update(pos,val,rt<<1);
else update(pos,val,rt<<1|1);
pushup(rt);
}int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=eof){
build(1,(1<
線段樹單點更新
hdu 1166 單點更新,求區間和 第一次寫線段樹,照著大神的抄了一遍 include include include define max 50100 define mid l r 1 define lson l,m,rt 1 define rson m 1,r,rt 1 1 using nam...
線段樹單點更新
g 梔子花開 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice fzu 1921 description 這是乙個梔子花開的季節,也是乙個離別的季節,四年一千多個日日夜夜,那校園...
線段樹單點更新 求和
第一行乙個整數t,表示有t組資料。每組資料第一行乙個正整數n n 50000 表示敵人有n個工兵營地,接下來有n個正整數,第i個正整數ai代表第i個工兵營地里開始時有ai個人 1 ai 50 接下來每行有一條命令,命令有4種形式 1 add i j,i和j為正整數,表示第i個營地增加j個人 j不超過...