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;

}

  

你可能感兴趣的:(树状数组)