[Navegación 1-2-3 por la medalla de oro de Ybt] Estadísticas de línea discontinua

Estadísticas de línea discontinua

Enlace al tema: navegación por la medalla de oro ybt 1-2-3

Tema

Hay algunos puntos en un gráfico, por lo que las coordenadas horizontal y vertical de dos puntos cualesquiera no son iguales.
Si selecciona algunos conjuntos y los conecta en el orden de coordenadas x, se formarán algunas polilíneas continuas ascendentes y descendentes, y se le preguntará cuántos conjuntos se satisfacen si el número de polilíneas es k.
La cantidad es módulo 100007.

Ideas

Para esta pregunta, consideremos cómo hacerlo con dp ordinario.

Porque presione xxLas coordenadas x están conectadas una al lado de la otra, luego primero presionamosxxLas coordenadas x se ordenan de menor a mayor. Entonces, si elige un conjunto aquí, los que están conectados aquí deben estar conectados.

Luego establecemos fi, j, k f_ {i, j, k}Fi , j , k为 前iii puntos deben ser seleccionadosiiSeleccionado desde el punto i para formarjjj segmento, y el estado del último segmento eskkk。 (kkk solo sube0 00 y hacia abajo1 11 Dos valores)
Es fácil pensar que la ecuación de transferencia se divide primero en ascendente y descendente, y luego es igual o diferente de la última etapa original.

Primero nos volvemos ascendentes, es decir, k = 0 k = 0 después de la transferenciak=0 situación.
Si no cambia, entonces el número de segmentos no cambia y la primera dimensión debe enumerar1 11 llegadai - 1 i-1yo-1kkk o0 00 .
Si cambia, el número de segmentos aumentará y el original será-1 -1- 1 , la primera dimensión sigue siendo la enumeración1 ∼ i - 1 1 \ sim i-11yo-1 , elkkoriginalk se convierte en1 11

Eso se convierte en un declive, que es la misma razón.
Pero la primera dimensión no es la enumeración 1 ∼ i - 1 1 \ sim i-11yo-1 , peroi + 1 ∼ 100000 i + 1 \ sim 100000yo+11 0 0 0 0 0 porque cambia de mayor a menor.

En cuanto a la inicialización, es fi, 0, 0 = fi, 0, 1 = 1 f_ {i, 0,0} = f_ {i, 0,1} = 1Fi , 0 , 0=Fi , 0 , 1=1

Pero su enumeración se agotará.
Entonces consideramos optimizarlo con algunas estructuras de datos.
Esto requiere sumas de intervalo y valores de actualización de un solo punto Es fácil pensar en usar arreglos de árbol.
Luego enumera 1 ∼ i - 1 1 \ sim i-11yo-1 es para consultar directamentei - 1 i-1yo-La posición de 1 ,i + 1 ∼ 100000 i + 1 \ sim 100000yo+11 0 0 0 0 0 , solo use la consulta100000 1000001 0 0 0 0 0 menos la consultaiiEl valor resultante de i . (La idea de la suma del prefijo)

Entonces básicamente está bien, recuerde tomar el módulo.

Código

#include<cstdio>
#include<algorithm>
#define mo 100007
#define ll long long

using namespace std;

struct node {
    
    
	int x, y;
}zb[100001];
int n, k;
ll f[50001][11][2], tree[100001][11][2], re, ans;

bool cmp(node X, node Y) {
    
    
	return X.x < Y.x;
}

void add(int now, int j, int k, ll add_num) {
    
    //树状数组操作
	for (int i = now; i <= 100000; i += i & (-i))
		tree[i][j][k] = (tree[i][j][k] + add_num) % mo;
}

ll get(int now, int j, int k) {
    
    
	re = 0;
	for (int i = now; i; i -= i & (-i))
		re = (re + tree[i][j][k]) % mo;
	return re;
}

int main() {
    
    
	scanf("%d %d", &n, &k);
	
	for (int i = 1; i <= n; i++) {
    
    
		scanf("%d %d", &zb[i].x, &zb[i].y);
	}
	
	sort(zb + 1, zb + n + 1, cmp);//按 x 坐标排序
	
	f[0][0][0] = 1;
	f[0][0][1] = 1;
	for (int i = 1; i <= n; i++) {
    
    
		f[i][0][0] = 1;
		f[i][0][1] = 1;
		
		add(zb[i].y, 0, 0, 1);
		add(zb[i].y, 0, 1, 1);//初始化
		
		for (int j = 1; j <= k; j++) {
    
    
			f[i][j][0] = (get(zb[i].y - 1, j, 0) + get(zb[i].y - 1, j - 1, 1)) % mo;
			//可以是跟前面一样上升,也可以变换,成为新的一段
			f[i][j][1] = ((get(100000, j, 1) - get(zb[i].y, j, 1) + get(100000, j - 1, 0) - get(zb[i].y, j - 1, 0)) % mo + mo) % mo;
			//同理,可以跟前面一样下降,也可以变换,由原来的上升变成下降
			//不过因为你是要下降,那你就要用全部减去上升的,才可以得到下降的
			//树状数组搞的是上升的,那如果你找 100000,就是最大值的话,就所有都找了一遍,就是全部的了
			//或者说这就是前缀和的思想
			
			add(zb[i].y, j, 0, f[i][j][0]);
			add(zb[i].y, j, 1, f[i][j][1]);
			//放进树状数组里面
		}
		
		ans = (ans + f[i][k][0]) % mo;//统计答案
		ans = (ans + f[i][k][1]) % mo;
	}
	
	printf("%lld", ans);
	
	return 0;
}

Supongo que te gusta

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