【poj2155】【二维数状数组】Matrix

本文介绍了一种使用二维数状数组解决区间翻转问题的方法,并提供了详细的代码实现。通过对输入数据进行预处理,利用数状数组快速完成区间翻转操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

楼教主出的题,先orz下。

这道题是修改区间询问点的题,由于二维线段树编程复杂度高,所以可以考虑用二维的数状数组实现,

使用C数组来记录翻转次数,查询的时候mod 2即为当前的数,更新的话需要将(x2,y2),(x1-1,y2),(x2,y1 - 1),(x1 - 1,y1 - 1)这四个矩形区域翻转,最后只有(x1,y1)->(x2,y2)这个矩形取反次数为奇数次,其余为偶数次,这样就实现了更新操作。

代码:

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000 + 10;
int c[maxn][maxn];
int n,m,T;
int lowbit(int x)
{
	return x & (-x);
}

void update(int x,int y)
{
	for(int i = x;i > 0;i -= lowbit(i))
		for(int k = y;k > 0;k -= lowbit(k))
			c[i][k]++;
}

int get(int x,int y)
{
	int sum = 0;
	for(int i = x;i <= n;i += lowbit(i))
		for(int k = y;k <= n;k += lowbit(k))
			sum += c[i][k];
	return sum;
}

void init()
{
	freopen("poj2155.in","r",stdin);
	freopen("poj2155.out","w",stdout);
}

void readdata()
{
	scanf("%d",&T);
	while(T--)
	{
		memset(c,0,sizeof(c));
		scanf("%d%d",&n,&m);
		for(int i = 1;i <= m;i++)
		{
			char op[2];
			scanf("%s",op);
			if(op[0] == 'C')
			{
				int x1,y1,x2,y2;
				scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
				update(x2,y2);
				update(x1-1,y1-1);
				update(x1-1,y2);
				update(x2,y1-1);
			}
			else
			{
				int x,y;
				scanf("%d%d",&x,&y);
				printf("%d\n",get(x,y) % 2);
			}
		}
		printf("\n");
	}
}

int main()
{
	init();
	readdata();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值