POJ 2566 Límite encontrado (prefijo y regla)

Enlace al
tema La idea principal del tema: hay consultas \ (m \) , cada vez que es necesario encontrar un rango en una secuencia de longitud \ (n \) cuyo valor absoluto esté más cerca del número dado. (Esta pregunta tiene spj, si hay más de una solución, solo envíe una).
  La pregunta parece una pregunta de toma de reglas, pero debido a que hay números positivos y negativos en la secuencia, la suma del intervalo no es monotónica, y la toma de reglas directa es obviamente imposible. Pero como la pregunta es sobre intervalos, hay formas de hacer que la secuencia sea monotónica. Si toma la suma del prefijo de la secuencia y luego ordena la suma del prefijo de pequeño a grande, entonces la diferencia entre el prefijo y la secuencia se vuelve monotónica. Si en orden ascendente, y para el prefijo \ (a_i \) y \ (A_j \) , \ (I <J \) , \ (J \) más grande \ (I \) es más pequeño, más la diferencia Más grande, es decir, mayor es el valor absoluto de la suma del intervalo.
  Sin embargo, debe tenerse en cuenta que se selecciona la posición inicial de la regla. Suponiendo que los prefijos y las secuencias se ordenan de pequeño a grande, para un prefijo y secuencia negativos, se debe tomar el prefijo más pequeño y la regla de inicio, de modo que cuanto mayor sea \ (r \) , el valor absoluto de la suma del intervalo de su regla es Cuanto mayor sea el valor, menor será \ (l \) y menor será el valor absoluto de la suma del intervalo de la regla. Cuando la regla alcanza \ (0 \) , significa que la regla lleva la regla a una determinada posición desde la primera posición. . Para un prefijo y secuencia positivos, la regla debe tomarse de \ (0 \) , lo que indica que la regla se toma de la primera posición a una posición determinada. Si la secuencia de números negativos también es de \ (0 \)Cuando comienza la regla, cuanto mayor sea \ (r \) , menor será el valor absoluto de la suma del intervalo, y cuanto mayor sea \ (l \), mayor será el valor absoluto de la suma entre celdas. Entonces, cada vez que agreguemos un elemento \ (0 \) al prefijo y la secuencia antes de ordenar , podemos hacer que el prefijo y la secuencia sean consistentes independientemente de si tienen números negativos. Es difícil de explicar, si no lo comprende, solo mire el código. . .

const int maxn = 1e5+10;
int n, m;
struct PRE {
	int num;int val;
	bool operator < (const PRE &a) const {
		return val<a.val;
	}
} pre[maxn];
int main(void) {
	while(~scanf("%d%d", &n, &m) && (n||m)) {
		pre[0].val = pre[0].num = 0;
		for (int i = 1; i<=n; ++i) {
			scanf("%d", &pre[i].val);
			pre[i].val+=pre[i-1].val; pre[i].num = i; 
		}
		sort(pre, pre+n+1);
		while(m--) {
			int t, l = 0, r = 1, ans, ansl, ansr, minn = INF;
			scanf("%d", &t);
			while(r<=n) {
				int d = abs(pre[r].val - pre[l].val);
				if (minn >= abs(d-t)) {
					minn = abs(d-t);
					ans = d;
					ansl = pre[l].num;
					ansr = pre[r].num;
				}
				if (d<=t) ++r;
				else ++l;
				if (l==r) ++r; //避免上一步出现l==r然后minn因此更新成0的情况,前缀和求区间相减的两个前缀和必不相等,除非是空区间
			}
			if (ansl>ansr) swap(ansl, ansr);
			printf("%d %d %d\n", ans, ansl+1, ansr); 
		}
	}
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/shuitiangong/p/12739951.html
Recomendado
Clasificación