bzoj 1452: [JSOI2009]Count

2016-06-20

一读完题,就知道这是一个数据结构体,c只有100这么小,那我们就用100课二维树状数组来维护就行了。树状数组绝对是世上最美妙的数据结构(果然我这种蒟蒻只能做这种sb题)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<queue>
 7 #define M 309
 8 #define ll long long
 9 #define Mo 12345678
10 using namespace std;
11 ll read()
12 {
13     char ch=getchar();
14     ll x=0,f=1;
15     for(;ch<'0'||ch>'9';ch=getchar())
16       if(ch=='-')
17         f=-1;
18     for(;ch>='0'&&ch<='9';ch=getchar())
19       x=x*10+ch-'0';
20     return x*f;
21 }
22 int n,m,a[M][M],shu[109][M][M];
23 void jia(int x,int i,int j)
24 {
25     for(;i<=n;i+=i&-i)
26       for(int k=j;k<=m;k+=k&-k)
27         shu[x][i][k]++;
28 }
29 void jian(int x,int i,int j)
30 {
31     for(;i<=n;i+=i&-i)
32       for(int k=j;k<=m;k+=k&-k)
33         shu[x][i][k]--;
34 }
35 int query(int x,int i,int j)
36 {
37     int ans=0;
38     for(;i;i-=i&-i)
39       for(int k=j;k;k-=k&-k)
40         ans+=shu[x][i][k];
41     return ans;
42 }
43 int main()
44 {
45     n=read();
46     m=read();
47     for(int i=1;i<=n;i++)
48       for(int j=1;j<=m;j++)
49         {
50             a[i][j]=read();
51             jia(a[i][j],i,j);
52         }
53     int q=read();
54     for(int i=1;i<=q;i++)
55       {
56           int k=read(),x1=read(),x2,y1,y2,c;
57         if(k==1)
58           {
59               y1=read();
60               c=read();
61               jian(a[x1][y1],x1,y1);
62               jia(c,x1,y1);
63               a[x1][y1]=c;
64           }
65         else
66           {
67               x2=read();
68               y1=read();
69               y2=read();
70               c=read();
71               printf("%d\n",query(c,x2,y2)-query(c,x2,y1-1)-query(c,x1-1,y2)+query(c,x1-1,y1-1));
72           }
73       }
74     return 0;
75 }

 

posted @ 2016-06-20 09:49  xiw5  阅读(158)  评论(0编辑  收藏  举报