树状数组的玄学功效

来源:互联网 发布:java 数字验证码识别 编辑:程序博客网 时间:2024/04/29 23:36

1.单点修改区间最值

详情请见
->blog.csdn.net/u010598215/article/details/48206959

裸题模板:HDU1745

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<algorithm>using namespace std;const int maxn=200005;int n,q;int h[maxn],s[maxn];void change(int x){    while(x<=n)    {        int lowbit=x&-x;        h[x]=s[x];        for(int i=1;i<lowbit;i<<=1)            h[x]=max(h[x],h[x-i]);        x+=lowbit;    }}int query(int x,int y){    int res=0;    while(x<=y)    {        res=max(res,s[y]);        y--;        for(;y-(y&-y)>=x;y-=y&-y)            res=max(res,h[y]);    }    return res;}int main(){    while(~scanf("%d%d",&n,&q))    {        memset(h+1,0,sizeof(int)*n);        for(int i=1;i<=n;i++)            scanf("%d",s+i),change(i);        while(q--)        {            char op[2];int a,b;            scanf("%s%d%d",op,&a,&b);            if(op[0]=='U')            {                s[a]=b;                change(a);            }            else printf("%d\n",query(a,b));        }    }    return 0;} 

2.区间修改+区间求和
详情请见->http://m.blog.csdn.net/blackjack_/article/details/74997479
模板裸题(luogu p3372):

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<algorithm>using namespace std;const int maxn=100005;int n,q;long long c[2][maxn];long long read(){    long long x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9')f=(ch=='-'?-1:1),ch=getchar();    while(ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();    return x*f;}void add(long long *tr,int pos,long long val){    for(int i=pos;i<=n;i+=i&-i)        tr[i]+=val;}void add(int l,int r,long long val){    add(c[0],l,val);    add(c[0],r+1,-val);    add(c[1],l,1LL*(l-1)*val);    add(c[1],r+1,1LL*-r*val);}long long query(long long *tr,int pos){    long long res=0;    for(int i=pos;i;i-=i&-i)        res+=tr[i];    return res;}long long query(int l,int r){    return 1LL*r*query(c[0],r)-query(c[1],r)-1LL*(l-1)*query(c[0],l-1)+query(c[1],l-1);}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)        add(i,i,read());    scanf("%d",&q);    while(q--)    {        int op,d1,d2;        long long d;        op=read();        if(op==1)        {            d1=read(),d2=read(),d=read();            add(d1,d2,d);        }        else         {            d1=read();            printf("%lld\n",query(d1,d1));        }    }}
原创粉丝点击