[树状数组][codevs1081]线段树练习2

来源:互联网 发布:java面向对象编程继承 编辑:程序博客网 时间:2024/05/22 01:32

传送门http://codevs.cn/problem/1081/
终于学会了树状数组区间修改&&单点查询,好感动QAQ
之前一直不懂差分。。网上blog还看不懂。。问别人还是不懂。。
然后过了hin长hin长时间 做了几道有关差分的水题 突然就开窍了QwQ
确实比线段树快很多呐
//不要问我为什么现在才学会,我是蒟蒻啊

#include <iostream>#include<cstdio>using namespace std;const int N=100001;int n,q,c[N],x,y,v,tp;inline void read(int &x){    x=0;int w=1;char ch=getchar();    for(;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') w=-1;    for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';    x=x*w;}void ymz(int x,int v){    for(;x<=n;x+=x&(-x)) c[x]+=v;}int find(int x){    int ans=0;    for(;x;x^=x&(-x)) ans+=c[x];    return ans;}int main() {    read(n);    for(int i=1;i<=n;i++){        read(x);        ymz(i,x);ymz(i+1,-x);    }    read(q);    for(int i=1;i<=q;i++){        read(tp);read(x);        if (tp==1){            read(y);read(v);            ymz(x,v);ymz(y+1,-v);        } else printf("%d",find(x));    }    return 0;}

顺便再贴一个线段树的板子好了(我线段树很丑

#include<iostream>#include<cstdio>using namespace std;const int N=100001;int n,q,tp,x,y,v,a[N],lazy[N*4],ans;inline void read(int &x){    x=0;int w=1;char ch=getchar();    for(;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') w=-1;    for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';    x=x*w;}void buildtree(int node,int L,int r){    if (L==r) lazy[node]=a[L];    else{        int mid=(L+r)>>1;        buildtree(node*2,L,mid);buildtree(node*2+1,mid+1,r);    }}void ymz(int node,int L,int r){    if (r<x||L>y) return;    if (L>=x&&r<=y) lazy[node]+=v;     else{         int mid=(L+r)>>1;         ymz(node*2,L,mid);ymz(node*2+1,mid+1,r);     }}void ask(int node,int L,int r){    if (r<x||L>x) return;    if (L==x&&r==x) ans=lazy[node];     else{         int mid=(L+r)>>1;         lazy[node*2]+=lazy[node];         lazy[node*2+1]+=lazy[node];         lazy[node]=0;         ask(node*2,L,mid);ask(node*2+1,mid+1,r);     }}int main(){    read(n);    for(int i=1;i<=n;i++) read(a[i]);    buildtree(1,1,n);    read(q);    for(int i=1;i<=q;i++){        read(tp);read(x);        if (tp==1) read(y),read(v),ymz(1,1,n);         else ask(1,1,n),printf("%d\n",ans);    //    for(int i=1;i<=4*n;i++) printf("%d ",lazy[i]);printf("\n");    }    return 0;}

除了好理解就没有别的优点。。

原创粉丝点击