LG3801 rojo de fantasía árbol pueblo línea de + inclusión y exclusión

Descripción del problema

Después del último fracaso, Remilia decidió lanzar Hongwu mutación de nuevo, pero con el fin de evitar el retorno gobernar sueño espiritual, decidió liberar la extraña batalla Hongwu.

Seremos vistos como un pueblo de la fantasía \ (n \ m veces \) área de cuadrados, no empecé a cualquiera de Hongwu área está cubierta. Remilia cada pie en un área, cada uno emitió una infinitamente larga Hongwu cuatro direcciones camión, puede afectar a la fila entera / toda la columna, pero no afecta a esa zona de la estación. Si los dos parches Hongwu colisión, ya que la densidad es demasiado grande y se asentará desaparecer. Reimu conscientes de esta mutación, la decisión de resolverlo. Pero antes de la resolución, los sueños espirituales para comprender una amplia gama de densidad de Hongwu. Dos operaciones se puede describir simplemente como:

1 x yRemilia coordenadas de pie \ ((x, y) \ ) posición de liberación a las infinitas Hongwu cuatro direcciones.

2 x1 y1 x2 y2Interrogación punto superior izquierdo \ ((X1, Y1) \) , un punto inferior derecho \ ((x2, y2) \ ) dentro del rectángulo, el número de áreas cubiertas Hong Wu.


solución del problema

El lugar también se considera la liquidación de pie.

El mantenimiento de dos líneas de árbol, un mantenimiento de línea, una columna de mantenimiento, la modificación de un solo punto, el intervalo de consulta (can árbol Fenwick)

Conjunto \ (R, C \) representan las filas y columnas están cubiertas con el número, la respuesta es de $ R \ times (y2 - y1 + 1) + C \ veces (x2 - x1 + 1) - 2 \ times R \ times C $ .

Menos dos veces \ (R \ veces C \) razones: extirpar los rangos estadísticas cada vez.


\ (\ Mathrm {code} \)

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

const int maxn = 100000 + 7;
const int maxm = 200000 + 7;

int n, m, T;

template < typename Tp >
void read(Tp &x) {
	x = 0;char ch = 1;int fh = 1;
	while(ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
	if(ch == '-') fh = -1, ch=getchar();
	while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
	x *= fh;
}

void Init(void) {
	read(n); read(m); read(T);
}

struct Segment_Tree {
	#define lfc (x << 1)
	#define rgc ((x << 1) | 1)
	#define mid ((l + r) >> 1)
	int val[maxn << 2];
	void modify(int x, int l, int r, int pos) {
		if(l == r) {
			val[x] = 1 - val[x];
			return ;
		}
		if(pos <= mid) modify(lfc, l, mid, pos);
		else modify(rgc, mid + 1, r, pos);
		val[x] = val[lfc] + val[rgc];
	}
	int query(int x, int l, int r, int L, int R) {
		if(L <= l && r <= R) return val[x];
		if(r < L || l > R) return 0;
		return query(lfc, l, mid, L, R) + query(rgc, mid + 1, r, L, R);
	}
}row, column;


void operator1(void) {
	int x, y;
	read(x); read(y);
	row.modify(1, 1, n, x);
	column.modify(1, 1, m, y);
}

void operator2(void) {
	int x1, x2, y1, y2;
	read(x1); read(y1); read(x2); read(y2);
	int R = row.query(1, 1, n, x1, x2), C = column.query(1, 1, m, y1, y2);
	LL ans = (LL)(y2 - y1 + 1) * (LL)R + (x2 - x1 + 1) *(LL)C - (LL)R * (LL)C * 2ll;
	printf("%lld\n", ans);
}

void Work(void) {
	while(T--) {
		int op; read(op);
		if(op == 1) operator1();
		else operator2();
	}
}

int main(void) {
	Init();
	Work();
	return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/liubainian/p/12571638.html
Recomendado
Clasificación