[JSOI2009]計數問題 [二維樹狀陣列]
阿新 • • 發佈:2018-12-09
我們發現m,n,c 都比較小 , 我們就每一個顏色建一個二維樹狀陣列
#include<bits/stdc++.h> #define N 305 #define M 105 using namespace std; int c[N][M][N],n,m,val[N][N]; void Up(int x,int y,int z,int val){ for(int i=x;i<=n;i+=i&-i){ for(int j=z;j<=m;j+=j&-j) c[i][y][j] += val; } } int Q(int x,int y,int z){ int ans=0; for(int i=x;i;i-=i&-i) for(int j=z;j;j-=j&-j) ans += c[i][y][j]; return ans; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ int x; scanf("%d",&x); Up(i,x,j,1); val[i][j]=x; } int q; scanf("%d",&q); while(q--){ int op; scanf("%d",&op); if(op==1){ int x,y,c; scanf("%d%d%d",&x,&y,&c); Up(x,val[x][y],y,-1); val[x][y]=c; Up(x,c,y,1); } if(op==2){ int x1,x2,y1,y2,c; scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c); int ans=Q(x2,c,y2) - Q(x2,c,y1-1) - Q(x1-1,c,y2) + Q(x1-1,c,y1-1); printf("%d\n",ans); } }return 0; }