zoukankan      html  css  js  c++  java
  • hdu 1166(树状数组 或 线段树)

    线段树 (本题无需建树,少了很多)

    #include<cstdio>
    #include<cstring>
    int sum[5000005],rt,data,lb,rb,n,m;
    void add(int p,int l,int r,int now)//data新加的数 第p个位置 第now个子树
    {
        sum[now]+=data;
        if(l==r) return;
        int mid=(l+r)/2;
        if(p<=mid) add(p,l,mid,2*now);
        else add(p,mid+1,r,2*now+1);
    }
    int query(int l,int r,int now)
    {
        int mid=(l+r)/2;
        if(lb<=l&&rb>=r) return(sum[now]);
        if(rb<=mid) return(query(l,mid,2*now));
        else if(lb>mid) return(query(mid+1,r,2*now+1));
        else return(query(l,mid,2*now)+query(mid+1,r,2*now+1));
    }
    int main()
    {
        int t,tt,i,j;
        char s[100];
        scanf("%d",&t);
        for(tt=1;tt<=t;tt++){
            scanf("%d",&n);
            printf("Case %d:
    ",tt);
            memset(sum,0,sizeof(sum));
            for(i=1;i<=n;i++){
                scanf("%d",&data);
                add(i,1,n,1);
            }
            while(1){
                scanf("%s",&s);
                if(s[0]=='E') break; else scanf("%d%d",&i,&j);
                switch(s[0]){
                    case 'A':data=j;add(i,1,n,1);break;
                    case 'S':data=-j;add(i,1,n,1);break;
                    case 'Q':lb=i;rb=j;printf("%d
    ",query(1,n,1));break;
                }
            }
        }
        return 0;
    }
    



    简单的树状数组

    先给个经典图片


    #include<iostream>
    #include<cstdio>
    #include<cstring>
    int n,a[50005];
    int lowbit(int a)
    {
        return(a&(-a));
    }
    void add(int p,int q)
    {
        for(int i=q;i<=n;i+=lowbit(i))
            a[i]+=p;
    }
    int sum(int q)
    {
        int ans=0;
        for(int i=q;i>0;i-=lowbit(i))
            ans+=a[i];
        return(ans);
    }
    int main()
    {
        int t,tt,i,j,k;
        char s[100];
        scanf("%d",&t);
        for(tt=1;tt<=t;tt++){
            scanf("%d",&n);
            printf("Case %d:
    ",tt);
            memset(a,0,sizeof(a));
            for(i=1;i<=n;i++){
                scanf("%d",&k);
                add(k,i);
            }
            while(1){
                scanf("%s",&s);
                if(s[0]=='E') break; else scanf("%d%d",&i,&j);
                switch(s[0]){
                    case 'A':add(j,i);break;
                    case 'S':add(-j,i);break;
                    case 'Q':printf("%d
    ",sum(j)-sum(i-1));break;
                }
            }
        }
        return 0;
    }
    


  • 相关阅读:
    七、Struts2之文件上传与下载
    八、Struts2之OGNL
    五、Struts2之类型转换
    wpf坐标转换相关
    wpf拖拽封装类
    获取Bitmap的Graphics
    Win32定时器
    vs2010调试dll
    使用GDI+ 保存HDC为位图文件
    在c++中使用.net
  • 原文地址:https://www.cnblogs.com/Mathics/p/3681183.html
Copyright © 2011-2022 走看看