Secuencia máxima HDU 6047 Cola monótona Pregunta de pensamiento Campamento de vacaciones de invierno

Steph está extremadamente obsesionada con los "problemas de secuencia" que generalmente se ven en las revistas: dada la secuencia 11, 23, 30, 35, ¿cuál es el siguiente número? Steph siempre los encuentra demasiado fáciles para un genio como él, hasta que un día Klay se le ocurre un problema y le pregunta al respecto.

Dadas dos secuencias enteras {ai} y {bi} con la misma longitud n, debes encontrar los siguientes n números de {ai}: an + 1… a2n. Como siempre, hay algunas restricciones sobre un + 1… a2n: para cada número ai, debe elegir un número bk de {bi}, y debe satisfacer ai≤max {aj-j│bk≤j <i}, y no se puede elegir ningún bk más de una vez. Aparentemente, hay muchas posibilidades, por lo que se requiere que encuentre max {∑2nn + 1ai} módulo 109 + 7.

Ahora a Steph le resulta muy difícil resolver el problema, por favor ayúdelo.
Entrada
La entrada no contiene más de 20 casos de prueba.
Para cada caso de prueba, la primera línea consta de un número entero n. La siguiente línea consta de n números enteros que representan {ai}. Y la tercera línea consta de n números enteros que representan {bi}.
1≤n≤250000, n≤a_i≤1500000, 1≤b_i≤n.
Salida
Para cada caso de prueba, imprima la respuesta en una línea: max {∑2nn + 1ai} módulo 109 + 7。
Entrada de muestra
4
8 11 8 5
3 1 4 2
Salida de muestra
27

Sugerencia
para la primera muestra:

  1. Elija 2 de {bi}, luego a_2… a_4 están disponibles para a_5, y puede dejar a_5 = a_2-2 = 9;
  2. Elija 1 de {bi}, luego a_1… a_5 están disponibles para a_6, y puede dejar a_6 = a_2-2 = 9;
    Tomamos la idea de una suma de prefijo de diferencia y restamos la i actual al ingresar una [i ] Está preprocesado de modo que el número que queda es el número que puede aparecer después de elegir b [i].
    Luego exprese a [i] como la posición i puede formar el número nuevo más grande, ordenar la matriz b, y establecer ans al valor máximo que se puede generar en b1, y luego colocarlo en la posición correspondiente a cada b [i] Compare la relación entre el valor máximo actual de a [i] y ans, y genere un nuevo valor máximo.
    De hecho, la longitud de n + 1 muestra que el primer ans que puedo generar es el valor máximo que se puede generar en toda la matriz a, y los valores de actualización subsiguientes solo se generarán en la matriz a y ans
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#define ls (p<<1)
#define rs (p<<1|1)
#define ll long long
using namespace std;
const int maxn = 2e6+5;
const int INF = 0x3f3f3f3f;
const int modn=1e9+7;
struct node{
    
    
	int val,id;
};
int a[maxn],b[maxn],c[maxn],que[maxn],dp[maxn],id[maxn];
node st[maxn];
void solve(){
    
    
   	int n,m,k;
	while(scanf("%d",&n)!=EOF){
    
    
	memset(a,0,sizeof(a));
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=n;i++){
    
    
		cin>>a[i];
		a[i]-=i;
	}
	for(int i=1;i<=n;i++)
		cin>>b[i];
	sort(b+1,b+1+n);
	for(int i=n-1;i>=1;i--){
    
    
		a[i]=max(a[i],a[i+1]);
	}
	int ans=0;
	dp[1]=a[b[1]];
	ans=dp[1]-n-1;
	for(int i=2;i<=n;i++){
    
    
		if(ans>=a[b[i]])
			dp[i]=ans;
		else
			dp[i]=a[b[i]];	
	}
	ll sum=0;
	for(int i=1;i<=n;i++){
    
    
		sum+=dp[i];
	}
	cout<<sum%modn<<endl;
	}

}
int main()
{
    
    
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    solve();
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45891413/article/details/112998245
Recomendado
Clasificación