bzoj1452 [JSOI2009]Count

题目链接

其实就是二维树状数组模板。

只不过要对每一种颜色开一个二维树状数组。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<string>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<algorithm>
 8 #include<ctime>
 9 #include<queue>
10 #include<stack>
11 #include<map>
12 #define lowbit(x) x&-x
13 using namespace std;
14 int n,m,h[333][333];
15 struct shuzu
16 {
17     int aa[333][333];
18     void add(const int &a,const int &b,const int &x)
19     {
20         for(int i=a;i<=n;i+=lowbit(i))
21             for(int j=b;j<=m;j+=lowbit(j))
22                 aa[i][j]+=x;
23     }
24     int query(const int &a,const int &b)
25     {
26         int ret=0;
27         for(int i=a;i;i-=lowbit(i))
28             for(int j=b;j;j-=lowbit(j))
29                 ret+=aa[i][j];
30         return ret;
31     }
32 }bb[111];
33 int getint()
34 {
35     int ret=0;
36     char ch=getchar();
37     while(ch<'0'||ch>'9')ch=getchar();
38     while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar();
39     return ret;
40 }
41 int main()
42 {
43     n=getint(),m=getint();
44     for(int i=1;i<=n;i++)
45         for(int j=1;j<=m;j++)
46         {
47             h[i][j]=getint();
48             bb[h[i][j]].add(i,j,1);
49         }
50     int q;
51     q=getint();
52     for(int i=1;i<=q;i++)
53     {
54         int op,q,w,e,r,t;
55         op=getint();
56         if(op==1)
57         {
58             q=getint(),w=getint(),e=getint();
59             bb[h[q][w]].add(q,w,-1);
60             h[q][w]=e;
61             bb[e].add(q,w,1);
62         }
63         else 
64         {
65             q=getint(),e=getint(),w=getint(),r=getint(),t=getint();
66             int ret=bb[t].query(e,r)-bb[t].query(q-1,r)-bb[t].query(e,w-1)+bb[t].query(q-1,w-1);
67             printf("%d\n",ret);
68         }
69     }
70     return 0;
71 }

 

posted @ 2016-01-22 14:03  HugeGun  阅读(162)  评论(0编辑  收藏  举报