首页 > 代码库 > poj 3468 A Simple Problem with Integers 降维线段树
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 else129 {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 6138 1 2 3 4 5139 Q 1 5140 U 3 6141 Q 3 4142 Q 4 5143 U 2 9144 Q 1 5145 146 */
poj 3468 A Simple Problem with Integers 降维线段树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。