708 二维差分2

// 708 二维差分2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://oj.daimayuan.top/course/22/problem/897

给一个n×m的矩阵a1,1,a1,2,…,a1,m,…,an,m和q个修改操作。

一开始所有位置都是0,每次修改给出五个数x1,y1,x2,y2,d,令所有ai,j(x1≤i≤x2,y1≤j≤y2)加上d。

求出所有操作结束之后,整个矩阵的值。

输入格式
第一行三个整数n,m,q(1≤n,m≤109,q≤2×103)。

接下来q行,每行五个整数x1,y1,x2,y2,d(1≤x1≤x2≤n,1≤y1≤y2≤m,1≤d≤109)。

输出格式
为了防止输出过大,输出操作完之后矩阵中所有数的异或和。

样例输入
5 5 3
1 1 2 3 5
2 2 4 3 6
4 3 5 5 10
样例输出
28
*/
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <array>
#include <algorithm>


using namespace std;

typedef long long ll;

const int N = 4100;
int n, m, q;
ll a[N][N];
vector<int> numx, numy;
array<int, 5> op[N];


int main()
{
	scanf("%d%d%d", &n, &m, &q);
	for (int i = 1; i <= q; i++) {
		int x1, y1, x2, y2, d;
		scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &d);
		op[i] = { x1,y1,x2,y2,d };
		numx.push_back(x1 - 1);
		numx.push_back(x2);
		numy.push_back(y1 - 1);
		numy.push_back(y2);
	}
	sort(numx.begin(), numx.end());
	numx.erase(unique(numx.begin(), numx.end()), numx.end());

	sort(numy.begin(), numy.end());
	numy.erase(unique(numy.begin(), numy.end()), numy.end());

	for (int i = 1; i <= q; i++) {
		int x1 = op[i][0]; int y1 = op[i][1];
		int x2 = op[i][2]; int y2 = op[i][3];
		int d = op[i][4];

		x1 = lower_bound(numx.begin(), numx.end(), x1 - 1) - numx.begin() + 1;
		x2 = lower_bound(numx.begin(), numx.end(), x2) - numx.begin();
		y1 = lower_bound(numy.begin(), numy.end(), y1 - 1) - numy.begin() + 1;
		y2 = lower_bound(numy.begin(), numy.end(), y2) - numy.begin();

		a[x1][y1] += d;
		a[x1][y2 + 1] -= d;
		a[x2 + 1][y1] -= d;
		a[x2 + 1][y2 + 1] += d;
	}

	int nX = numx.size(), nY = numy.size();
	for (int i = 1; i <= nX; i++) {
		for (int j = 1; j <= nY; j++) {
			a[i][j] += a[i][j - 1];
		}
	}

	for (int i = 1; i <= nX; i++) {
		for (int j = 1; j <= nY; j++) {
			a[i][j] += a[i - 1][j];
		}
	}

	ll ans = 0;
	for (int i = 1; i < nX; i++) {
		for (int j = 1; j < nY; j++) {
			ll sz = (ll)(numx[i] - numx[i - 1]) * (numy[j] - numy[j - 1]);
			if (sz % 2 == 1) ans ^= a[i][j];
		}
	}

	printf("%lld\n", ans);

	return 0;
}

posted on   itdef  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示