2021.8.18北高暑训
今天早上我们学习了树状数组(搞不懂为什么我们先学线段树再学树状数组)
我对于她的lowbit 有些许不理解为什么x&(-x)是在一般情况下,对于 int 型的正数,最高位是 0,接下来是其二进制表示;而对于负数 (-x),表示方法是把 x 按位取反之后再加上 1(不过老师说背就完了)
推荐例题
#include<bits/stdc++.h> using namespace std; int n,m,a,c[500001],c3,c1,c2; inline int lowbit(register int x) { return x&(-x); } inline void add(register int x,register int k) { while(x<=n) { c[x]+=k; x+=lowbit(x); } } inline int getsum(register int x) { register int ans=0; while(x!=0) { ans+=c[x]; x-=lowbit(x); } return ans; } int main() { scanf("%d%d",&n,&m); for(register int i=1;i<=n;++i) { scanf("%d",&a); add(i,a); } while(m--) { scanf("%d%d%d",&c3,&c1,&c2); if(c3==1) { add(c1,c2); } if(c3==2) { printf("%d\n",getsum(c2)-getsum(c1-1)); } } return 0; }
#include<bits/stdc++.h> using namespace std; int n,m,a,c[500001],ch,c1,c2,k; inline int lowbit(register int x) { return x&(-x); } inline void add(register int x,register int k) { while(x<=n) { c[x]+=k; x+=lowbit(x); } } inline int getsum(register int x) { register int ans=0; while(x!=0) { ans+=c[x]; x-=lowbit(x); } return ans; } int main() { scanf("%d%d",&n,&m); for(register int i=1;i<=n;++i) { scanf("%d",&a); add(i,a); } while(m--) { scanf("%d",&ch); if(ch==1) { scanf("%d%d%d",&c1,&c2,&k); add(c1,k); add(c2+1,-k); } if(ch==2) { scanf("%d",&c1); printf("%d\n",getsum(c1)/2); } } return 0; }
下午我们照常做了一套初赛题
拿了79pats(马 乔 亻敖[doge])
感觉这次的题程序完善不是很难但是理论题我错了挺多(真就理论题和程序实现题我都不会呗)
今天又TM是开森的一天呢!

浙公网安备 33010602011771号