POJ-1195 Mobile phones 二維樹組+二維數組

来源:互联网 发布:windows 8.1 下载 编辑:程序博客网 时间:2024/06/10 04:08

在寫之前先行注明

二維樹狀數組->樹組

本題爲二維樹狀數組的模板題,作爲學習樹狀數組的開始,首先復習一下樹狀數組的模板不會的百度

更新:

void add(int p,int lala){//變量要定得有新意    for(int i=p;i<=n;i+=lowbit(i))        f[i]+=lala;    return 0;}

求值:

int query(int p){    int haha=0;    for(int i=p;i;i-=lowbit(i))        haha+=f[i];    return haha;}

辣麼感性地想一想,拓展到二維時 不只用加一維嗎
如dp般玄學
上模板:
*哎呀,第一次寫博客,編輯器用不習慣,就一起發啦

inline void add(int x,int y,int add){    for(int i=x;i<=n;i+=lowbit(i))    for(int j=y;j<=n;j+=lowbit(j))    f[i][j]+=add;       return ;}inline int query(int x,int y){    int sum=0;    for(int i=x;i;i-=lowbit(i))    for(int j=y;j;j-=lowbit(j))    sum+=f[i][j];    return sum;}

是不是十分美觀,簡潔, 沒壓行算給面子的了

下面言歸正傳

題意

給定一個S*S的矩陣,每次有倆操作,一是將(i,j)加上add,二是同價一個給定矩陣中的數之和。

個人最討厭打題解不打題意的了

題解

一個二維樹組的模板題

被虐代碼

#include<cstdio>#include<cstring>using namespace std;#define lowbit(x) (-x&x)const int maxn=1050;int n,f[maxn][maxn];inline void add(int x,int y,int add){    for(int i=x;i<=n;i+=lowbit(i))        for(int j=y;j<=n;j+=lowbit(j))            f[i][j]+=add;       return ;}inline int query(int x,int y){    int sum=0;    for(int i=x;i;i-=lowbit(i))        for(int j=y;j;j-=lowbit(j))            sum+=f[i][j];    return sum;}int main(){    int p;    int a,b,c;    int l,xia,r,shang;    while(1){        scanf("%d",&p);        if(!p){            scanf("%d",&n);            memset(f,0,sizeof(f));            continue;        }        else if(p==1){            scanf("%d%d%d",&a,&b,&c);            add(a+1,b+1,c);            continue;        }        else if(p==2){            scanf("%d%d%d%d",&l,&xia,&r,&shang);            l++,r++,xia++,shang++;            printf("%d\n",query(r,shang)+query(l-1,xia-1)-query(l-1,shang)-query(r,xia-1));continue;        }        else if(p==3)return 0;    }    return 0;}

代碼醜不要介意,打繁體才是最醜的

原创粉丝点击