BZOJ_P1452 [JSOI2009]Count(二维树状数组)

来源:互联网 发布:linux中的cat命令 编辑:程序博客网 时间:2024/06/06 09:07

BZOJ传送门

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1749 Solved: 1046
[Submit][Status][Discuss]
Description

这里写图片描述

Input

这里写图片描述

Output
这里写图片描述

Sample Input

这里写图片描述

Sample Output

1
2

HINT

这里写图片描述

Source

Sol:
二维树状数组裸题..如果你不介意树套树的话其实也可以…

#include<cstdio>#define N 305#define C 105inline int in(int x=0,char ch=getchar()){while(ch>'9'||ch<'0') ch=getchar();    while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x;}int d[N][N][C],a[N][N];int n,m,q;inline void Add(int x,int y,int c,int v){    for(int i=x;i<=n;i+=i&-i) for(int j=y;j<=m;j+=j&-j) d[i][j][c]+=v;}inline int Sum(int x,int y,int c,int res=0){    for(int i=x;i;i-=i&-i) for(int j=y;j;j-=j&-j) res+=d[i][j][c];return res;}int main(){    n=in(),m=in();int opt,x1,x2,y1,y2,c;    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=in(),Add(i,j,a[i][j],1);    q=in();    while(q--){        opt=in();        if(opt^1){            x1=in(),x2=in(),y1=in(),y2=in(),c=in();            printf("%d\n",Sum(x2,y2,c)-Sum(x2,y1-1,c)-Sum(x1-1,y2,c)+Sum(x1-1,y1-1,c));        }        else{            x1=in(),y1=in(),c=in();            Add(x1,y1,a[x1][y1],-1),a[x1][y1]=c;            Add(x1,y1,c,1);        }    }return 0;}
2 0
原创粉丝点击