• 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;
    }
    


  • 相关阅读:
    Flutter子组件调用父组件方法修改父组件参数
    Flutter点击两次返回键退出APP
    Flutter路由跳转父级页面向子页面传参及子页面向父级页面传参
    Flutter中用ListView嵌套GridView报错异常
    前端项目统一 ESlint 规则集
    前端规范
    手写防抖(Debouncing)和节流(Throttling)
    手写promise进阶版本
    实现一个call或 apply
    实现一个JSON.stringify()
  • 原文地址:https://www.cnblogs.com/Mathics/p/3681183.html
Copyright © 2020-2023  润新知