Descripción
Para una secuencia que contenga n (1 <= n <= 100000) números enteros, para cada elemento de la secuencia, busque el primer valor mayor que su posición en la secuencia; si lo encuentra, genere el valor encontrado; de lo contrario, Salida -1.
Aporte
Hay varios grupos de entrada, la primera línea de entrada t (1 <= t <= 10), lo que significa el número de grupos de entrada;
Luego está la entrada de t grupos: cada grupo primero ingresa n, lo que significa el número de elementos en la secuencia de este grupo, y luego ingresa los n elementos de este grupo a su vez.
Producción
Hay varios grupos de salida y se genera una línea en blanco entre cada grupo (no hay después del último grupo);
Cada grupo de salida genera el elemento actual y su resultado de búsqueda línea por línea en el orden de los elementos en esta secuencia, con un -> intervalo entre los dos.
Muestra
Aporte
2
4 12 20 15 18
5 20 15 25 30 6
Salida
12–> 20
20 -> - 1
15–> 18
18 -> - 1
20–> 25
15–> 25
25–> 30
30 -> - 1
6 -> - 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int s[400001],a[400000],b[400000],c;
int main()
{
int i,top,n,t,k;
scanf("%d",&t);
for(k=1; k<=t; k++)
{
memset(b,0,sizeof(b));
memset(s,0,sizeof(s));
memset(a,0,sizeof(a));
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
top=0;
b[n]=-1;
s[++top]=a[n];
for(i=n-1; i>=1; i--)
{
if(a[i]<s[top])
{
b[i]=s[top];
s[++top]=a[i];
}
else
{
while(a[i]>=s[top]&&top!=0)
top--;
if(top==0)
{
b[i]=-1;
s[++top]=a[i];
}
else
{
b[i]=s[top];
s[++top]=a[i];
}
}
}
for(i=1; i<=n; i++)
printf("%d-->%d\n",a[i],b[i]);
if(k!=t) printf("\n");
}
return 0;
}