当前位置: 首页 > article >正文

矩阵Matrix(POJ2155)

给一个N*N的矩阵A,其中元素是0或1。A[i][j]表示在第i行第j列的数。最初时,A[i][j]=0(1<=i,j<=N)。我们以以下方式来改变矩阵,给定一个矩形的左上角为(x1,y1)和右下角为(x2,y2),我们对这个矩形范围内的所有元素进行“非”操作(如果它是一个'0',那么变化为'1',否则它变为'0')。

请你编写一个程序完成以下两种操作:

比较简单

用二维树状数组,每次区间增加1,然后单点查询每一个点对2取模的值。

好做完了。

#include <bits/stdc++.h>
using namespace std;
const long long N = 1050;
long long n,m;
class owl{
public:
	long long tr[N][N];
	long long lowbit(long long x){
		return x & -x;
	}
	void add(long long x,long long y,long long d){
		for (long long i = x; i <= n; i += lowbit(i)){
			for (long long j = y; j <= n; j += lowbit(j)){
				tr[i][j] += d;
			}
		}
	}
	long long sum(long long x,long long y){
		long long res = 0;
		for (long long i = x; i ; i -= lowbit(i)){
			for (long long j = y; j; j -= lowbit(j)){
				res += tr[i][j];
			}
		}
		return res;
	}
}A,B,C,D;
void owladd(long long a,long long b,long long c){
	A.add(a,b,c);
	B.add(a,b,c * a);
	C.add(a,b,c * b);
	D.add(a,b,a * b * c);
}
long long owlsum(long long a,long long b){
	return A.sum(a,b) * (a * b + a + b + 1) - B.sum(a,b) * (b + 1) - C.sum(a,b) * (a + 1) + D.sum(a,b);
}
int main(){
	int T;
	cin >> T;
	while (T -- ){
		cin >> n >> m;
		memset(A.tr,0,sizeof A.tr);
				memset(B.tr,0,sizeof B.tr);
				memset(C.tr,0,sizeof C.tr);
				memset(D.tr,0,sizeof D.tr);
		while (m -- ){
			char op;
			cin >> op;
			if (op == 'C'){
				long long a,b,c,d,z = 1;
				cin >> a >> b >> c >> d;
				owladd(a,b,z);
				owladd(a,d + 1,-z);
				owladd(c + 1,b,-z);
				owladd(c + 1,d + 1,z);
			}
			else if (op == 'Q'){
				long long a,b,c,d;
				cin >> a >> b;
				c = a,d = b;
				cout << (owlsum(c,d) - owlsum(a - 1,d) - owlsum(c,b - 1) + owlsum(a - 1,b - 1)) % 2 << endl;
			}
		}
		cout << endl;
	}
	return 0;
}

http://www.kler.cn/a/470690.html

相关文章:

  • 【计算机视觉】单目深度估计模型-Depth Anything-V2
  • php反序列化 ctf例题演示 框架安全(TP,Yii,Laravel) phpggc生成框架利用pop
  • 测试岗位的基础知识
  • 装修房子,你会选购灯和搭配灯光吗?
  • 深度学习中多个损失怎么平衡?
  • NUTTX移植到STM32
  • uniapp-vue3 实现, 一款带有丝滑动画效果的单选框组件,支持微信小程序、H5等多端
  • 【Duilib】 List控件支持多选和获取选择的多条数据
  • 嵌入式 TCP/UDP/透传/固件
  • JVM实战—如何分析jstat统计来定位GC
  • github gitbook写书
  • 算法基础 - 二分查找
  • 定位,CSS高级技巧,修饰属性(定位,css精灵,字体图标)
  • 在K8S上部署OceanBase的最佳实践
  • Mac修改文件权限
  • 如何在 JavaScript 中实现日期格式化?
  • mac无限刷新navicat试用时间
  • linux RT-Preempt -- 优先级继承实现
  • 如何使用Spark Streaming
  • rk3568 上Qt5.12.12迁移问题解决
  • R 语言科研绘图第 14 期 --- 柱状图-分组堆叠
  • Kubernetes容器设计模式
  • Linux——查看并修改文件夹可读可写等权限
  • Docker Compose下载及使用-1.初识
  • HarmonyOS:@Reusable装饰器:组件复用
  • 【C语言程序设计——函数】编写子函数求x的n次方(头歌实践教学平台习题)【合集】