zoukankan      html  css  js  c++  java
  • hdu1892树状数组

    按理来说应该会有二维的树状数组的算法吧。。可是我不知道。。于是就用一维的方式在累加了。。时间复杂度大概在o(m*n*log(n))。。直接暴力是o(m*n^2)

    #include<iostream>
    using namespace std;
    
    const int MAXN=1003;
    int data[MAXN][MAXN];
    void swap(int &a,int &b)
    {
        int t;
        t=a;
        a=b;
        b=t;
    }
    int lowbit(int idx)
    {
        return idx & (-idx);
    }
    void add(int x,int y,int inc,int n)
    {
        for (int i = x; i <= n; i += lowbit(i))
        {
            data[y][i] += inc;
        }
        return ;
    }
    int sum_of(int pos,int y) 
    {
        int sum = 0;
        for (int i = pos; i > 0; i -= lowbit(i)) 
        {
            sum += data[y][i];
        }
        return sum;
    }
    void init()
    {
        int i,j;
        for(i=1;i<=MAXN-1;i++)
            for(j=1;j<=MAXN-1;j++)
            {
                data[i][j]=lowbit(j);
                //cout<<data[i][j]<<"  ";
            }
                
    }
    int main()
    {
        int t;
        cin>>t;
        int i=0;
        for(i=1;i<=t;i++)
        {
            cout<<"Case "<<i<<":"<<endl;
            init();
            int q;
            cin>>q;
            while(q--)
            {
                char c;
                cin>>c;
                switch(c)
                {
                    int x1,y1,x2,y2,n1;
                    case 'S':
                        {
                            int suum=0;
                            int j;
                            cin>>x1>>y1>>x2>>y2;
                            x1++;
                            x2++;
                            y1++;
                            y2++;
                            if(y1>y2)
                            {
                                swap(x1,x2);
                                swap(y1,y2);
                            }
                            
                            for(j=y1;j<=y2;j++)
                            {
                                if(x1>x2)
                                {
                                    swap(x1,x2);
                                }
                                suum=suum+sum_of(x2,j)-sum_of(x1-1,j);
                            }
                            cout<<suum<<endl;
                        }
                        break;
                    case 'A':
                        cin>>x1>>y1>>n1;
                        x1++;
                        y1++;
                        add(x1,y1,n1,MAXN);
                        break;
                    case 'D':
                    {
                        cin>>x1>>y1>>n1;
                        x1++;
                        y1++;
                        int numxy=sum_of(x1,y1)-sum_of(x1-1,y1);
                        if(numxy-n1<0)
                        {
                            add(x1,y1,-numxy,MAXN);
                        }else
                        {
                            add(x1,y1,-n1,MAXN);
                        }
                        break;
                    }
                    case 'M':
                    {
                        cin>>x1>>y1>>x2>>y2>>n1;
                        x1++;
                        y1++;
                        x2++;
                        y2++;
                        int numxy=sum_of(x1,y1)-sum_of(x1-1,y1);
                        if(numxy-n1<0)
                        {
                            add(x1,y1,-numxy,MAXN);
                            add(x2,y2,numxy,MAXN);
                        }else
                        {
                            add(x1,y1,-n1,MAXN);
                            add(x2,y2,n1,MAXN);
                        }                    
                        break;
                    }
                }
            } 
        }
        return 0;
    }
    

      

    本博客(http://www.cnblogs.com/cj695/)未标明转载的内容均为本站原创,非商业用途转载时请署名(77695)并注明来源(http://www.cnblogs.com/cj695/)。商业用途请联系作者(77695) QQ:646710030。作者(77695)保留本博客所有内容的一切权利。
    独立博客:http://nfeng.cc/
  • 相关阅读:
    垃圾处理现状
    买了个学生阿里云114元啊,安装mysql
    4 存储器
    3 总线
    崔大哥说基础很重要
    idea使用小积累mac
    为啥要用left join on where这样的东西
    观察者模式
    从shell中退出python命令
    locust性能测试入门
  • 原文地址:https://www.cnblogs.com/cj695/p/2618190.html
Copyright © 2011-2022 走看看