2020 ganado de invierno campo de entrenamiento de base algoritmo de 6 Matriz F Cruz

https://ac.nowcoder.com/acm/contest/3007/F
Título Descripción

Q aprendido poco nuevo tipo de magia, puede causar daño al enemigo en la parrilla de N filas y M columnas

La magia i-ésima puede atravesar una región en la parrilla (es decir, XI y la primera fila y la segunda columna yi) provocar daños en la zi enemigo para cada uno de los cuadrados en

pequeña caja Q ahora utilizando un total de H tiempos de magia, es necesario contar con todo el daño después de la colada se completa, como una descripción detallada de salida

Recordatorio: cuanto mayor sea la magnitud de esta entrada problema, utilice el modo de entrada eficiente

1≤H≤500,000 1≤xi, yi, zi, N, M≤2000 1≤xi≤N, 1≤yi≤M

pensamiento 

 En primer lugar, para cada coordenada (X_ {i}, y_ {i}), en la que las filas se ven afectados, por lo que, hasta cierto punto (A, b), el resultado final es que el impacto total de los efectos generales de la línea donde recibió + donde la columna recibido, nota que si el medio una vez que este punto porque nace del impacto, será más calcula una vez , así que con w [i] [j]el impacto de registro para cada punto mediante el uso de dos matrices, respectivamente, para mantener las filas y columnas de árboles, al recibir (X_ {i}, y_ {i})el impacto del árbol en una matriz x_ {i}de filas y y_ {i}las columnas son, junto con el impacto trasero, a continuación w [x_ {i}] [y_ {i}] = w [x_ {i}] [y_ {i}] - z_ {i}, la deduplicación afecta al punto actual, donde la última buscan influir en la fila y columna para cada punto, y luego w [i] [j](el punto actual) es afectar el punto de suma.

Multiplicado por la (I + j)suma de un módulo

#include <bits/stdc++.h>
#define mem(a, b) memset(a, b, sizeof a)
using namespace std;
const int N = 2010;
typedef long long ll;
const int mod = 1e9 + 7;
template <class T>
bool read(T & a){
	a = 0;
	int flag = 0;
	char ch;
	if((ch = getchar()) == '-'){
		flag = 1;
	}
	else if(ch >= '0' && ch <= '9'){
		a = a * 10 + ch - '0';
	}
	while ((ch = getchar()) >= '0' && ch <= '9'){
		a = a * 10 + ch - '0';
	}
	if(flag)a = -a;
	return true;
}
template <class T, class ... R>
bool read(T & a, R & ... b){
	if(!read(a))return 0;
	read(b...);
}
template <class T>
bool out(T a){
	if(a < 0)putchar('-');
	if(a >= 10)out(a / 10);
	putchar(a % 10 + '0');
	return true;
}
template <class T, class ... R>
bool out(T a, R ... b){
	if(!out(a))return 0;
	out(b...);
}
ll n, m, h;
ll w[N][N];
ll a[N][2];
ll lowbit(ll x){
	return x & -x;
}
ll add(ll x, ll val, ll ind){
	if (ind == 0){
		while (x <= n){
			// ά»¤ÐÐ
			a[x][0] += val;
			x += lowbit(x); 
		}
	}
	else {
		while (x <= m){
			a[x][1] += val;
			x += lowbit(x);
		}
	}
}
ll query(ll x, ll ind){
	ll res = 0;
	while (x){
		res += a[x][ind];
		x -= lowbit(x);
	}
	return res;
}
int main()
{
	read(n, m, h);
	mem(w, 0);
	mem(a, 0);
	for (int i = 1; i <= h; i++){
		ll x, y, z;
		read(x, y, z);
		add(x, z, 0);
		add(y, z, 1);
		w[x][y] -= z;
	}
	ll res = 0;
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= m; j++){
			ll t1 = query(i, 0) - query(i - 1, 0);
			ll t2 = query(j, 1) - query(j - 1, 1);
			w[i][j] += t1 + t2;
			res += w[i][j] % mod * (i + j) % mod;
			res %= mod;
		}
	}
	out(res % mod);
	return 0;
}

 

Publicados 204 artículos originales · elogios ganado 13 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_43701790/article/details/104332031
Recomendado
Clasificación