程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva 11992 線段樹對矩陣進行更新查詢

uva 11992 線段樹對矩陣進行更新查詢

編輯:C++入門知識

 

 

把矩陣變成一行,然後計算位置,lrj給了線段樹數組做法 但是我做的線段樹空間過大,直接爆掉,所以換方法了

主要還是測試自己的線段樹區間更新的模板

各種RE+WA之後AC,,,,,

 

做的時候出現的幾個錯誤:

1、行和列弄錯

2、build初始化的時候,mmin mmax 都初始化為0才對

 

 

 

#include
#include
#include
using namespace std;

#define lson(i) l , mid , (i)*2
#define rson(i) mid + 1 , r , ((i)*2 +1)
#define ll rt*2
#define rr (rt*2+1)

const int INFMIN = 0xffffffff;
const int INFMAX = 1000000009;//0x80000000;
const int MAXN = 30001000;
struct Node{
    int l,r;
    int mmax,mmin,sum,add,s;/*s去標記是不是被set*/
};
Node nodes[MAXN];

    int mmax,mmin,sum;
    void PushUp(int rt)
    {
        nodes[rt].mmax = max(nodes[ll].mmax,nodes[rr].mmax);
        nodes[rt].mmin = min(nodes[ll].mmin,nodes[rr].mmin);
        nodes[rt].sum = nodes[ll].sum + nodes[rr].sum;
    }
    void PushDown(int rt)
    {
        //if(nodes[rt].add && flag == 1)
        if(nodes[rt].add)
        {
            nodes[ll].add += nodes[rt].add;
            nodes[ll].mmin += nodes[rt].add;
            nodes[ll].mmax += nodes[rt].add;
            nodes[rr].add += nodes[rt].add;
            nodes[rr].mmin += nodes[rt].add;
            nodes[rr].mmax += nodes[rt].add;

            nodes[ll].sum += nodes[rt].add*(nodes[ll].r-nodes[ll].l+1);
            nodes[rr].sum += nodes[rt].add*(nodes[rr].r-nodes[rr].l+1);
            nodes[rt].add = 0;
        }
        //if(nodes[rt].s && flag == 2)
        if(nodes[rt].s)
        {
            nodes[ll].s = nodes[rr].s=nodes[rt].s;
            nodes[ll].mmin = nodes[ll].mmax = nodes[rr].mmax = nodes[rr].mmin = nodes[rt].mmax;
            nodes[ll].sum = nodes[rt].mmin*(nodes[ll].r-nodes[ll].l+1);
            nodes[rr].sum = nodes[rt].mmin*(nodes[rr].r-nodes[rr].l+1);
            nodes[ll].add = nodes[rr].add = 0;//////////////
            nodes[rt].s=0;
        }
    }
    void Build(int l,int r,int rt)
    {
        nodes[rt].l=l;
        nodes[rt].r=r;
        nodes[rt].add =0;
        nodes[rt].s=0;
        nodes[rt].sum =0;
        nodes[rt].mmin=0;
        nodes[rt].mmax=0;
        if(l == r)
        {
            //nodes[rt].mmin = nodes[rt].mmax = nodes[rt].sum =a[l];
            nodes[rt].mmin = nodes[rt].mmax = nodes[rt].sum =0;////////////////
            return ;
        }
        int mid = (nodes[rt].l+nodes[rt].r)/2;
        Build(lson(rt));
        Build(rson(rt));
        //PushUp(rt);
    }

    void Update(int l,int r,int add,int rt,int flag)
    {
/////////////////////////////////////////////////////////////////
//printf(rt=%d l=%d r=%d add=%d flag =%d nodes[rt].l=%d nodes[rt].r=%d
,rt,l,r,add,flag,nodes[rt].l,nodes[rt].r);
        if(l<=nodes[rt].l && nodes[rt].r<=r)
        {
            if(flag == 1)/*increase*/
            {
                nodes[rt].mmax += add;
                nodes[rt].mmin += add;
                nodes[rt].add += add;
                nodes[rt].sum += add*(nodes[rt].r-nodes[rt].l+1);

            }
            else
            {
                nodes[rt].mmax = add;
                nodes[rt].mmin = add;
                nodes[rt].add=0;
                nodes[rt].s=1;
                nodes[rt].sum = add*(nodes[rt].r-nodes[rt].l+1);
            }
            return;
        }
        PushDown(rt);
        int mid = (nodes[rt].l+nodes[rt].r)/2;
        if(l<=mid)Update(l,r,add,ll,flag);
        if(r>mid)Update(l,r,add,rr,flag);
        PushUp(rt);
    }
    void Query(int l,int r,int rt)/*1表示mmin 2--mmax 3-sum*/
    {
    /////////////////////////////////////////////////////////////////
//printf(rt=%d l=%d r=%d  nodes[rt].l=%d nodes[rt].r=%d
,rt,l,r,nodes[rt].l,nodes[rt].r);
 ///////////////////////////////////////////////////////////////////////////
        if(l<=nodes[rt].l && nodes[rt].r<=r)
        {
            mmin = min(mmin,nodes[rt].mmin);
            mmax = max(mmax,nodes[rt].mmax);
            sum += nodes[rt].sum;
            return ;
        }
        PushDown(rt);
        int mid = (nodes[rt].l+nodes[rt].r)/2;
        if(l<=mid)Query(l,r,ll);
        if(r>mid)Query(l,r,rr);
        PushUp(rt);
    }
    void clr()/*每次查詢之前使用*/
    {
        sum =0;
        mmin=INFMAX;
        mmax=INFMIN;
    }

int main()
{
    //freopen(uva11992.txt,r,stdin);
    int r,c,m,v,flag,x1,y1,x2,y2;

    while(scanf(%d%d%d,&r,&c,&m)!=EOF)
    {
        Build(1,r*c,1);
        while(m--)
        {
            scanf(%d%d%d%d%d,&flag,&x1,&y1,&x2,&y2);
            if(flag<3)
            {
                scanf(%d,&v);
                for(int i=x1;i<=x2;i++)/*此處注意*/
                {
///////////////////////////////////////////////////////////////
//printf(i=%d
,i);

                    Update(y1+(i-1)*c,y2+(i-1)*c,v,1,flag);
                }
            }
            else
            {
                int anssum=0,ansmin=INFMAX,ansmax=INFMIN;
                for(int i=x1;i<=x2;i++)
                {
                    clr();
                    Query(y1+(i-1)*c,y2+(i-1)*c,1);
                    ////////////////////////
                   // printf(**min=%d
,mmin);
                    /////////////////
                    anssum+=sum;
                    ansmax=max(ansmax,mmax);
                    ansmin=min(ansmin,mmin);
                }
                printf(%d %d %d
,anssum,ansmin,ansmax);
            }
        }
    }

    return 0;
}



 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved