Code Vs 1082 线段树练习 3

来源:互联网 发布:淘宝达人怎么赚钱的 编辑:程序博客网 时间:2024/05/16 23:33

线段树写法
  
/*作者:Greetrix题目:p1082 线段树练习 3*/#include<iostream>#include<cstdlib>using namespace std;const int M=200000;struct Seb_tree{int l;int r;long long sum;int col;};Seb_tree t[M*6+1];int s[M*2];int n, m;void push_down(int k){if (t[k].col){int lson=k*2;int rson=lson+1;t[lson].sum+=(t[lson].r-t[lson].l+1)*t[k].col;t[lson].col+=t[k].col;t[rson].sum+=(t[rson].r-t[rson].l+1)*t[k].col;t[rson].col+=t[k].col;t[k].col=0;}}long long  query(int l,int r , int k){if (t[k].l>=l && t[k].r<=r) return t[k].sum;int mid=(t[k].l+t[k].r)/2;push_down(k);if (r<=mid) query(l ,r, k*2);else if (l>mid) query(l ,r, k*2+1);else return query(l ,mid, k*2)+query(mid+1, r, k*2+1);}void updata(int l, int r, int col, int k){if (t[k].l>=l && t[k].r<=r){t[k].sum+=(t[k].r-t[k].l+1)*col;t[k].col+=col;return;}push_down(k);int mid=(t[k].l+t[k].r)/2;if (r<=mid) updata(l ,r, col, k*2);else if (l>mid) updata(l, r, col, k*2+1);else {updata(l ,mid,col,  k*2);updata(mid+1, r, col, k*2+1);}t[k].sum=t[k*2].sum+t[k*2+1].sum;}void build(int l, int r, int k){t[k].l=l;t[k].r=r;t[k].col=0;if (l==r) t[k].sum=s[r];else {int mid=(l+r)/2;build(l ,mid, k*2);build(mid+1, r, k*2+1);t[k].sum=t[k*2].sum+t[k*2+1].sum;}}void debug(){for (int i=1; i<=n*2+1; i++) cout<<t[i].sum<<" ";cout<<endl;}int main(){cin>>n;for (int i=1; i<=n; i++) cin>>s[i];build(1, n, 1);//debug();cin>>m;while (m--){int a, b, c, d;cin>>a;if (a==1){cin>>b>>c>>d;updata(b, c, d, 1);}else {cin>>b>>c;cout<<query(b,c,1)<<endl;}}return 0;}

树状数组写法:

  
#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>#define For1(x,n) for(int i=x; i<=n; i++)using namespace std;const int M=800010;int a[M];int d[M];long long  d2[M];long long  c[M];int n, m;int low_bit(int x) { return x & (x ^ (x-1));}void debug(){int sum=0;For1(1,n) {}printf("\n");}void updata1(int i, int val){while (i<=n){d2[i]+=val;i+=low_bit(i);}}void updata(int i, int val){while (i<=n){c[i]+=val;i+=low_bit(i);}}long long  query1(int i){long long  sum=0;while (i){sum+=d2[i];i-=low_bit(i);}return sum;}long long   query(int i){long long  sum=0;while (i){sum+=c[i];i-=low_bit(i);}return sum;}void init(){memset(d, 0, sizeof(d));memset(c, 0, sizeof(c));memset(a,0,sizeof(a));memset(d2, 0, sizeof(d2));scanf("%d", &n);For1(1,n) scanf("%d ",&a[i]);a[0]=0;For1(1,n) {updata(i,a[i]-a[i-1]);updata1(i,(a[i]-a[i-1])*i);}}void solve(){scanf("%d",&m);For1(1,m){int q, l, r, val;scanf("%d", &q);if (q==1){scanf("%d %d %d", &l, &r, &val);updata(l,val);updata(r+1,-val);updata1(l,val*l);updata1(r+1, -val*(r+1));}else if (q==2){long long   sum=0;scanf("%d %d", &l, &r);sum=(r+1)*query(r)-query1(r);    sum-=l*query(l-1)-query1(l-1);    printf("%lld\n", sum);}}}int main(){init();solve();return 0;}

0 0
原创粉丝点击