線段樹單點更新

2021-06-18 13:22:11 字數 3025 閱讀 7221

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 namespace std;

int sum[max<<2];

void pushup(int rt)

void build(int l,int r,int rt)

int m=mid;

build(lson);

build(rson);

pushup(rt);

}void updata(int s,int add,int l,int r,int rt)

int m=mid;

if(s<=m) updata(s,add,lson);

else updata(s,add,rson);

pushup(rt);

}int query(int l,int r,int l,int r,int rt)

int m=mid;

int ret=0;

if(l<=m) ret+=query(l,r,lson);

if(r>m) ret+=query(l,r,rson);

return ret;

}int main()

} }return 0;

}

hdu 1754 i hate it

單點更新,求區間最值

#include #include #include #define max 200100

#define mid (l+r)>>1

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

using namespace std;

int num[max<<2];

int n,m;

int max(int a,int b)

void build(int l,int r,int rt)

int m=mid;

build(lson);

build(rson);

num[rt]=max(num[rt<<1],num[rt<<1|1]);

}int query(int l,int r,int l,int r,int rt)

int m=mid;

int ret=-0x3f3f3f3f;

if(l<=m) ret=max(ret,query(l,r,lson));

if(r>m) ret=max(ret,query(l,r,rson));

return ret;

}void updata(int p,int add,int l,int r,int rt)

int m=mid;

if(p<=m) updata(p,add,lson);

else updata(p,add,rson);

num[rt]=max(num[rt<<1],num[rt<<1|1]);

}int main()

} return 0;

}

poj  2828 

向序列內部插入數字,求最後的序列

#include #include #include #define max  200100

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define mid (l+r)>>1

using namespace std;

int num[max<<2],n;

int pos[max],value[max];

int id;

int ans[max];

void build(int l,int r,int rt)

int m=mid;

build(lson);

build(rson);

}void updata(int p,int l,int r,int rt)

int m=mid;

if(num[rt<<1]>=p) updata(p,lson); //當左子樹有充足空位時,插在左子樹

else }

int main()

for(int i=n; i>=1; i--)

for(int i=1; i<=n; i++)

}return 0;

}

hdu 1556

每次更新只需要更新到子樹的根節點,然後在最後求的時候從根節點加到葉節點,即為葉節點被染色的次數

#include #include #include using namespace std;

#define max 100100

#define mid (l+r)>>1

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

int num[max<<2];

int n;

void updata(int l,int r,int l,int r,int rt)

int m=mid;

if(l<=m) updata(l,r,lson);

if(r>m) updata(l,r,rson);

}void query(int l,int r,int rt,int sum)

int m=mid;

sum+=num[rt];

query(lson,sum);

query(rson,sum);

}int main()

query(1,n,1,0);

} return 0;

}

線段樹(單點更新)

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 tr...

線段樹單點更新

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不超過...