您的位置:首页 > 其它

[bzoj 1452] Count (树状数组)

2017-05-25 11:48 351 查看
传送门

题目描述



输入



输出



样例输入



样例输出

1

2

提示



思路

因为权值最大为100 所以对于每一种权值建一个树状数组

然后维护和查询就不多说了

(PS:输出千万别用cout 我RE了10次 改printf就A了!! QwQ)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,q;
int a[305][305];
int t[105][305][305];//每一个权值建立的二维数组
int lowbit(int x){
return x&(-x);
}
void update(int x,int y,int p,int k){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=m;j+=lowbit(j))
t[p][i][j]+=k;
}
int getsum(int x,int y,int p){
int sum=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
sum+=t[p][i][j];
return sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
update(i,j,a[i][j],1);
}
}
scanf("%d",&q);
for(int i=1;i<=q;i++){
int k;
scanf("%d",&k);
int x1,x2,y1,y2,c;
if(k==1){
scanf("%d %d %d",&x1,&y1,&c);
update(x1,y1,a[x1][y1],-1);
a[x1][y1]=c;
update(x1,y1,a[x1][y1],1);
}
else{
scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c);
int ans=0;
ans=getsum(x2,y2,c)-getsum(x1-1,y2,c)-getsum(x2,y1-1,c)+getsum(x1-1,y1-1,c);
cout<<ans<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: