1452: [JSOI2009]Count
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2496 Solved: 1451
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
Sample Output
1
2
感觉没有什么技术含量,弄懂一维数组就好了
简单来说就是树状数组套树状数组
代码中没有解析
#include<stdio.h>
int n, m, a[305][305], tre[105][305][305];
int lowbit(int x)
{
return x&-x;
}
void Update(int x, int y, int c, int val)
{
int i, j;
for(i=x;i<=n;i+=lowbit(i))
{
for(j=y;j<=m;j+=lowbit(j))
tre[c][i][j] += val;
}
}
int Query(int x, int y, int c)
{
int sum, i, j;
for(i=x;i>0;i-=lowbit(i))
{
for(j=y;j>0;j-=lowbit(j))
sum += tre[c][i][j];
}
return sum;
}
int main(void)
{
int ans, q, i, j, t, x1, x2, y1, y2, c;
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d", &a[i][j]);
Update(i, j, a[i][j], 1);
}
}
scanf("%d", &q);
while(q--)
{
scanf("%d", &t);
if(t==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
{
ans = 0;
scanf("%d%d%d%d%d", &x1, &x2, &y1, &y2, &c);
ans = Query(x2, y2, c)+Query(x1-1, y1-1, c);
ans -= Query(x1-1, y2, c)+Query(x2, y1-1, c);
printf("%d\n", ans);
}
}
return 0;
}