zoukankan      html  css  js  c++  java
  • 【树转数组】poj1195

    /*
    二维的树状数组:
    更新某个元素时:
    NO.1:c[n1],c[n2],c[n3],....,c[nm];
    当中n1 = i,n(i+1) = ni+lowbit(ni);
    nm+lowbit(nm)的值应该大于元素个数N。
    NO.2:sum(k)=c[n1]+c[n2]+...+c[nm];
    当中nm=k,n(i-1)=ni-lowbit(ni);
    n1-lowbit(n1)的值应该小于0
    ----------------------------------------------------------------------
    用二维的c[i][j]存储长条的和。。。、
    ---------------------------------------
    元素的值加一个数:
    void update(int x, int y, int a)
    {
        for(int i=x; i<=s; i+=lowbit(i))
        {
            for(int j=y; j<=s; j+=lowbit(j))
                c[i][j] += a;
        }
    }
    ---------------------------------------------------
    int sum(int x, int y)矩阵0到x和0到y的元素和
    {
        int ret = 0;
        for(int i=x; i>0; i-=lowbit(i))
        {
            for(int j=y; j>0; j-=lowbit(j))
                ret += c[i][j];
        }
        return ret;
    }
    ------------------------------------------------
    */
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    int op,s;
    int x,y,a;
    int l,b,r,t;
    int c[1050][1050];
    
    int lowbit(int x)
    {
        return x & (-x);
    }
    
    void update(int x, int y, int a)
    {
        for(int i=x; i<=s; i+=lowbit(i))
        {
            for(int j=y; j<=s; j+=lowbit(j))
                c[i][j] += a;
        }
    }
    
    int sum(int x, int y)
    {
        int ret = 0;
        for(int i=x; i>0; i-=lowbit(i))
        {
            for(int j=y; j>0; j-=lowbit(j))
                ret += c[i][j];
        }
        return ret;
    }
    
    int main()
    {
        //freopen("input.txt","r",stdin);
        while(1)
        {
            scanf("%d",&op);
            if(op == 0)
            {
                scanf("%d",&s);
                memset(c, 0, sizeof(c));
            }
            if(op == 1)
            {
                scanf("%d%d%d",&x,&y,&a);
                update(x+1, y+1, a);
            }
            if(op == 2)
            {
                scanf("%d%d%d%d",&l, &b,&r,&t);
                l++;
                b++;
                r++;
                t++;
                printf("%d
    ",sum(r, t) - sum(r, b-1) - sum(l-1, t) + sum(l-1, b-1) );
            }
            if(op == 3)
                return 0;
        }
    }
    

    ----------------------------------

    快。。。。。

  • 相关阅读:
    spring事务详解(一)初探讨
    spring事务详解(二)实例
    mysql删除重复数据只保留一条
    jdk1.8源码Synchronized及其实现原理
    jdk1.8源码Thread与Runnable区别
    动态创建类并添加属性赋值
    c# 当代热门技术
    c# 开源框架
    极限并发带来的思考(12306 抢票)
    ASP.NET Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程 (Challenge)
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4519306.html
Copyright © 2011-2022 走看看