poj 3468 A Simple Problem with Integers 降维线段树
Posted 可是我不配
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 3468 A Simple Problem with Integers 降维线段树相关的知识,希望对你有一定的参考价值。
这道题是区间更新线段树模板题
记录一下降维线段树
正常线段树是倍增的
rt<<1 rt<<1+1
这个线段树用了getid的方法使线段树降了一维
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 #include<ctime> 8 #include<map> 9 #include<set> 10 #include<vector> 11 #include<queue> 12 #include<cstdlib> 13 #include<cassert> 14 #include<sstream> 15 #include<stack> 16 #include<list> 17 #include<bitset> 18 #define cl(a,b) memset(a,b,sizeof(a)) 19 #define debug(x) cerr<<#x<<"=="<<(x)<<endl 20 using namespace std; 21 typedef long long ll; 22 typedef long double ldb; 23 typedef pair<int,int> pii; 24 25 #define ls getid(l,l+r>>1) 26 #define rs getid((l+r>>1)+1,r) 27 #define lson l,m,ls 28 #define rson m+1,r,rs 29 30 typedef long long ll; 31 32 const int maxn = 1e5+10; 33 34 inline int getid(int x,int y) 35 { 36 return x+y|y!=x; 37 } 38 39 ll rm[maxn<<1],col[maxn<<1]; 40 41 void pushup(int l,int r,int rt) 42 { 43 rm[rt]=rm[ls]+rm[rs]; 44 } 45 46 void pushdown(int l,int r,int rt,int k) 47 { 48 if (col[rt]) 49 { 50 col[ls] += col[rt]; 51 col[rs] += col[rt]; 52 rm[ls] += col[rt]*(k-(k>>1)); 53 rm[rs] += col[rt]*(k>>1); 54 col[rt] = 0; 55 } 56 } 57 58 void build(int l,int r,int rt) 59 { 60 if(l == r) 61 { 62 scanf("%I64d",&rm[rt]); 63 return ; 64 } 65 int m=l+r>>1; 66 build(lson); 67 build(rson); 68 pushup(l,r,rt); 69 } 70 71 void update(int L,int R,int c,int l,int r,int rt) 72 {//区间更新 73 if(L<=l && r<=R) 74 { 75 col[rt]+=c; 76 rm[rt]+=c*(r-l+1); 77 return ; 78 } 79 pushdown(l,r,rt,r-l+1); 80 int m=l+r>>1; 81 if( L <= m ) update(L,R,c,lson); 82 if (R > m) update(L,R,c,rson); 83 pushup(l,r,rt); 84 } 85 86 void update(int p,int c,int l,int r,int rt) 87 {//单点更新 88 if(l==r) 89 { 90 rm[rt]+=c; 91 return ; 92 } 93 int m=l+r>>1; 94 if( p <= m ) update(p,c,lson); 95 else update(p,c,rson); 96 pushup(l,r,rt); 97 } 98 99 ll query(int L,int R,int l,int r,int rt) 100 { 101 if( L<=l && r<=R ) 102 { 103 return rm[rt]; 104 } 105 pushdown(l,r,rt, r-l+1); 106 int m=l+r>>1; 107 ll ret = 0; 108 if( L<=m ) ret += query(L,R,lson); 109 if( m<R ) ret += query(L,R,rson); 110 return ret; 111 } 112 113 int main() 114 { 115 int n,m; 116 scanf("%d%d",&n,&m); 117 char str[2]; 118 build(1,n,1); 119 while(m--) 120 { 121 int l,r,x; 122 scanf("%s",str); 123 if(str[0]==‘Q‘) 124 { 125 scanf("%d%d",&l,&r); 126 printf("%I64d\n",query(l,r,1,n,1)); 127 } 128 else 129 { 130 scanf("%d %d %d", &l, &r, &x); 131 update(l, r, x, 1, n, 1); 132 } 133 } 134 return 0; 135 }/* 136 137 5 6 138 1 2 3 4 5 139 Q 1 5 140 U 3 6 141 Q 3 4 142 Q 4 5 143 U 2 9 144 Q 1 5 145 146 */
以上是关于poj 3468 A Simple Problem with Integers 降维线段树的主要内容,如果未能解决你的问题,请参考以下文章
A Simple Problem with Integers POJ - 3468
POJ - 3468 A Simple Problem with Integers
[poj3468]A Simple Problem with Integers
POJ3468 a simple problem with integers 分块