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;
}
本文介绍了一个基于二维树状数组实现的高效算法,用于解决JSOI2009 Count问题。该问题涉及二维矩阵上的区间更新与查询操作,通过树状数组巧妙地实现了快速响应。
411

被折叠的 条评论
为什么被折叠?



