2352 Estrellas: Número de estrellas son una molestia! Cómo Búsqueda de Fenwick árbol de la violencia

Sujeto al efecto

FIG astrónomos estudian a menudo estrella, la estrella en el dibujo, la estrella está representada por un punto en el plano, tenemos coordenadas cartesianas de cada estrella. Hacer una fila de estrella es el número de estrellas en la esquina inferior izquierda de su exhaustiva.
vínculo del título original

análisis de las ideas

En primer lugar, pensar en la búsqueda violenta Sí estaba tan débil , no trate de cómo vivir?

#include<iostream>
#include<iomanip>
#include<string.h>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;

#define ll int
#define MAX 15005
struct star {
	ll x, y;
	star(ll a = 0, ll b = 0) { x = a, y = b; }
}s[MAX];
ll cnt[MAX];
ll res[MAX];
int main() {
	ll n; cin >> n;
	memset(cnt, 0, sizeof(cnt));
	memset(res, 0, sizeof(res));
	for (int i = 0; i < n; i++)scanf_s("%d%d", &s[i].x, &s[i].y);
	for (int i = 1; i < n; i++) {
		for (int j = i - 1; j >= 0; j--) {
			if (s[i].x >= s[j].x&&s[i].y >= s[j].y)
				cnt[i]++;
		}
	}
	for (int i = 0; i < n; i++) {
		res[cnt[i]]++;
	}
	for (int i = 0; i < n; i++)cout << res[i] << endl;
}

Expectativas TLE, pensar acerca de cómo optimizar, observar la entrada, la entrada se clasifica, por las mismas estrellas coordinarlos para cada uno adicional en sus abscisas derecha estrellas del mismo nivel será 1. Cómo determinar los cambios que se ordenada? Ruoguo una entrada de corriente ( X , y ) (x,y) coordenadas no son los mismos que en una coordenada y, a continuación, lo que tenemos que hacer al respecto? Tenemos que encontrar y - 1 y-1 línea, la ordenada inferior o igual X X número de todos los puntos, más el número del banco ha sido introducida en el punto. Si mantenemos una matriz una [ yo ] ai] sistema representa la coordenada y antes de la actual y la abscisa es igual aila cantidad de puntos, considere la forma de actualización, podría ir de nuevo la muestra

5
1 1
5 1
7 1
3 3
5 5
		a[1]	a[2]	a[3]	a[4]	a[5]	a[6]	a[7]
第一行:
(1,1)    1		 0	 	 0		 0		 0		 0		 0
(5,1)	 0		 0	  	 0		 0		 1		 0		 0  	
(7,1)	 0		 0		 0		 0		 1		 0		 1	  
第二行:
(3,3)	 1	 	 0	  	 1	 	 0		 1	 	 0	 	 1
第三行:
(5,5)	 1		 0		 1		 0		 2		 0		 1  

Para (5,1), tenemos que encontrar antes de una [5] y todos los elementos, por la segunda línea (3,3), aún tenemos que encontrar todos los elementos antes de una [3] la suma, que es: consulta intervalo. Si el mismo intervalo, prefijos, y puede manejar todo array aparente, pero cada punto de entrada, necesitamos la coordenada x que corresponde a la posición de una [x] + = 1: Árbol de la actualización de un único punto, la matriz puede venir práctico

#include<iostream>
#include<string.h>
#include<string>
#include<iomanip>
#include<algorithm>
#include<vector>
using namespace std;

#define ll int
#define MAX 32005

ll N, a[MAX], level[MAX];

void add(ll pos, ll val) {
	for (ll i = pos; i < MAX; i += i & (-i)) {
		a[i] += val;
	}
}

ll sum(ll t) {
	ll res = 0;
	for (ll i = t; i > 0; i -= i & (-i))
	{
		res += a[i];
	}
	return res;
}

int main() {
	scanf_s("%d", &N);
	for (ll i = 0; i < N; i++) {
		ll s = 0, t = 0;
		scanf_s("%d%d",&s, &t);
		level[sum(s + 1)]++;//树状数组是从1开始的,坐标从0开始,统一加1;
		add(s + 1, 1);
	}
	for (ll i = 0; i < N; i++)cout << level[i] << endl;
}
Publicados 186 artículos originales · alabanza ganado 13 · vistas 9327

Supongo que te gusta

Origin blog.csdn.net/csyifanZhang/article/details/105153290
Recomendado
Clasificación