[Ybt High-Efficiency Advanced 4-2-4] [POJ 3468] Consulta de intervalo de modificación de intervalo / Un problema simple con números enteros

Consulta de intervalo de modificación de intervalo / Un problema simple con enteros

Enlace de tema: ybt de alta eficiencia avanzado 4-2-4 / POJ 3468

Idea general

Dada una matriz, necesita mantener dos operaciones: suma de intervalo y suma de intervalo.

Ideas

Esta pregunta en realidad se puede hacer con un árbol de segmento de línea, pero la longitud del árbol de segmento de línea es relativamente grande, consideramos si se puede hacer con una matriz de árbol.

En general, las matrices en forma de árbol solo pueden lograr bonificaciones de un solo punto. Consideramos convertir las bonificaciones de intervalo en bonificaciones de un solo punto. Naturalmente, pensaría en usar la diferencia.

Luego consideramos cómo obtener la respuesta a través de la diferencia: (independientemente de la matriz de árbol, y luego usamos la matriz de árbol para optimizar más adelante).
Sea la matriz de diferencias di d_iDyo, El número de mantenimiento real es ai a_iayo, Entonces puedes obtener ai = ∑ j = 1 idj a_i = \ sum \ limits_ {j = 1} ^ {i} d_jayo=j = 1yoDj.
Entonces, encontrar la suma del intervalo es naturalmente un método para restar dos sumas de prefijos. Simplemente encuentre la suma de prefijos antes: ∑ i = 1 nai = ∑ i = 1 n ∑ j = 1 idj \ sum \ limits_ {i = 1} ^ {n } a_i = \ sum \ limits_ {i = 1} ^ {n} \ sum \ limits_ {j = 1} ^ {i} d_ji = 1nayo=i = 1nj = 1yoDj

Entonces observas cada dj d_jDjNúmero de ocurrencias, di d_iDyoAparece 1 11 primaria,di - 1 d_ {i-1}Di - 1Es dos veces, y así sucesivamente d 1 d_1D1Si iii veces.
Entonces podemos hacerlo así:
∑ i = 1 nai = ∑ i = 1 n (di × (n + 1) - di × i) \ sum \ limits_ {i = 1} ^ {n} a_i = \ sum \ límites_ {i = 1} ^ {n} (d_i \ times (n + 1) -d_i \ times i)i = 1nayo=i = 1n( dyo×( n+1 )-Dyo×yo )

Como puede ver, necesitamos encontrar dos valores rápidamente, ∑ i = 1 ndi \ sum \ limits_ {i = 1} ^ {n} d_ii = 1nDyo∑ i = 1 n (di × i) \ sum \ limits_ {i = 1} ^ {n} (d_i \ times i)i = 1n( dyo×i ) , luego haga dos matrices de árboles para mantener.

Entonces, debido a que usted es una diferencia, cuando inserte el número inicial, recuerde restarlo en una posición posterior.

Código

ybt

#include<cstdio>
#define ll long long

using namespace std;

int n, q, x, op, l, r;
ll tree[1000001], treei[1000001];

void add(int x, ll y) {
    
    
	int m = x;
	for (; x <= n; x += x & (-x)) {
    
    
		tree[x] += y;
		treei[x] += y * m;
	}
}

ll get_ans(int x) {
    
    
	ll re = 0;
	int m = x;
	for (; x; x -= x & (-x)) {
    
     
		re += tree[x] * (m + 1) - treei[x];
	}
	return re;
}

int main() {
    
    
	scanf("%d %d", &n, &q);
	
	for (int i = 1; i <= n; i++) {
    
    
		scanf("%d", &x);
		add(i, 1ll * x);
		add(i + 1, -1ll * x);
	}
	
	for (int i = 1; i <= q; i++) {
    
    
		scanf("%d", &op);
		if (op == 1) {
    
    
			scanf("%d %d %d", &l, &r, &x);
			add(l, 1ll * x);
			add(r + 1, -1ll * x); 
		}
		else {
    
    
			scanf("%d %d", &l, &r);
			printf("%lld\n", get_ans(r) - get_ans(l - 1));
		}
	}
	
	return 0;
}

POJ 版

#include<cstdio>
#define ll long long

using namespace std;

int n, q, x, l, r;
char op;
ll tree[1000001], treei[1000001];

void add(int x, ll y) {
    
    
	int m = x;
	for (; x <= n; x += x & (-x)) {
    
    
		tree[x] += y;
		treei[x] += y * m;
	}
}

ll get_ans(int x) {
    
    
	ll re = 0;
	int m = x;
	for (; x; x -= x & (-x)) {
    
     
		re += tree[x] * (m + 1) - treei[x];
	}
	return re;
}

int main() {
    
    
	scanf("%d %d", &n, &q);
	
	for (int i = 1; i <= n; i++) {
    
    
		scanf("%d", &x);
		add(i, 1ll * x);
		add(i + 1, -1ll * x);
	}
	
	for (int i = 1; i <= q; i++) {
    
    
		op = getchar();
		while (op != 'Q' && op != 'C') op = getchar();
		if (op == 'C') {
    
    
			scanf("%d %d %d", &l, &r, &x);
			add(l, 1ll * x);
			add(r + 1, -1ll * x); 
		}
		else {
    
    
			scanf("%d %d", &l, &r);
			printf("%lld\n", get_ans(r) - get_ans(l - 1));
		}
	}
	
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43346722/article/details/114851047
Recomendado
Clasificación