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 2025-01-15 14:01  itdef  阅读(55)  评论(0)    收藏  举报

导航