线段树专题(持续更新)
2017-09-14 10:52
260 查看
单点更新,单点/区间查询
hdu 1166 / 模板
区间更新
hdu 1698 / 模板
hdu 1166 / 模板
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; typedef long long ll ; const int M = 50005 ; int sum[M << 2 ] ; void push_up(int node ){ sum[node] = sum[node<<1] + sum[node<<1|1] ; } void build (int l , int r , int node ){ if( l == r ){ scanf("%d" , &sum[node]) ; return ; } int mid = (l + r) >> 1 ; build(l , mid , node<<1) ; build(mid+1 , r , node<<1|1) ; push_up(node) ; } void update(int p , int add , int l , int r , int node){ if( l == r ) { sum[node] += add ; return ; } int mid = (l + r) >> 1 ; if(p <= mid) update(p , add , l , mid , node<<1) ; else update(p , add , mid+1 , r , node<<1|1) ; push_up(node) ; } int query(int L , int R , int l , int r , int node){ if(L <= l && r <= R ) return sum[node]; int mid = (l + r) >> 1 ; int ans = 0 ; if(L <= mid) ans += query(L , R ,l,mid,node<<1); if(R > mid) ans += query(L,R,mid+1,r,node<<1|1); return ans; } int main(){ int kase , tt = 1 , a , b ; scanf("%d" , &kase) ; char read[10] ; while( kase -- ){ int n ; scanf("%d" , &n) ; memset(sum , 0 , sizeof(sum)) ; build(1 , n , 1 ) ; printf("Case %d:\n" , tt ++ ) ; while(~scanf("%s" , read) ){ if(read[0] == 'E') break ; scanf("%d %d" , &a , &b) ; if(read[0] == 'Q'){ int ans = query(a , b , 1 , n , 1 ) ; printf("%d\n" , ans ) ; }else if( read[0] == 'A'){ update(a , b , 1 , n , 1) ; }else if( read[0] == 'S'){ update(a , -b , 1 , n , 1) ; }else break ; } } }
区间更新
hdu 1698 / 模板
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; const int max_num = 100010 ; typedef long long ll ; /// update through consecutive flag == lazy array struct Seg{ int flag , value ; }; Seg seg[max_num<<2] ; void init(int l , int r , int node ){ seg[node].flag = 1 ; seg[node].value = 1 ; return ; } void push_down(int node){ if(seg[node].flag){ seg[node<<1].flag = seg[node<<1|1].flag = 1 ; seg[node<<1].value = seg[node<<1|1].value = seg[node].value; seg[node].flag = 0 ; } } void push_up(int node){ if(seg[node<<1].flag && seg[node<<1|1].flag){ if(seg[node<<1].value == seg[node<<1|1].value){ seg[node].flag = 1 ; seg[node].value = seg[node<<1].value ; } } } void update(int L , int R , int v ,int l , int r , int node ){ if( L == l && r == R ){ seg[node].flag = 1 ; seg[node].value = v ; return ; } int mid = (l + r) >> 1 ; push_down(node) ; if(R <= mid) update(L , R , v , l , mid , node<<1) ; else if(L > mid) update(L , R , v , mid+1 , r , node<<1|1) ; else { update(L , mid , v , l , mid , node<<1) ; update(mid+1 , R , v , mid+1 , r , node<<1|1) ; } //push_up(node) ; } int query(int l , int r , int node){ if(seg[node].flag){ return seg[node].value * ( r - l + 1 ) ; } int mid = (l + r) >> 1 ; return query(l , mid , node< 4000 <1) + query(mid+1 , r , node<<1|1) ; } int main() { int kase , tt = 1 ; scanf("%d" , &kase) ; int n , op , a , b , c ; while( kase -- ){ scanf("%d %d" , &n , &op) ; init(1 , n , 1) ; while(op -- ){ scanf("%d %d %d" , &a , &b , &c) ; update(a , b , c , 1 , n , 1) ; } printf("Case %d: The total value of the hook is %d.\n",tt++,query(1,n,1)); } return 0 ; }
相关文章推荐
- 线段树[专题总结][持续更新...]
- [kuangbin带你飞]专题七 线段树 ABCDE 题解,持续更新
- [总结]数学专题(持续更新)
- 动态规划[专题总结][持续更新...]
- 线段树模板及专题合集-----不断更新中
- 【线段树】线段树学习贴(持续更新)
- 在 Visual Studio 2013 中创建 ASP.NET Web 项目(0):专题导航 [持续更新中]
- Leetcode.Bit Manipulation.位运算专题.(持续更新)
- 数论专题(持续更新.avi)
- 持续更新 ing | Wannacry 勒索病毒专题
- 【专题总结】网络流与二分图(持续更新)
- 线段树专题 A(单点更新)
- 线段树专题#5_蒟蒻训练历程记录_HDU 1394 Minimum Inversion Number_单点更新+思维转换
- 动态规划专题(持续更新中)
- 线段树专题#6_蒟蒻训练历程记录_HDU 2705 Billboard_单点更新
- 系统架构推荐专题文章及书籍-会持续更新
- 矩阵快速幂专题(持续更新ing.avi)
- PHP专题(持续更新)
- 线段树专题【暂停更新中】
- 线段树专题#4_蒟蒻训练历程记录_HDU1698_ 延迟标记、区间更新