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

  

posted @ 2012-08-01 14:02  77695  阅读(331)  评论(0编辑  收藏  举报