Enlace de envío: Idea del portal
: para cada persona, considere cuántos puntajes individuales son más pequeños que él y elija un valor máximo entre los dos, ya que esto garantizará que todos se dividan en naranjas. Usando la idea de la suma del prefijo, procese los lados izquierdo y derecho de cada número menos que él, y luego recorra para obtener el valor máximo. (Ps: los datos de Luoguo se están agotando, no hay caso en que los números adyacentes sean iguales).
El código es el siguiente:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxx=1e6+100;
int a[maxx];
int L[maxx],R[maxx];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
a[0]=a[n+1]=-1;
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
L[1]=R[n]=0;
for(int i=2;i<=n;i++)
{
if(a[i]>a[i-1]) L[i]=L[i-1]+1;
else if(a[i]==a[i-1]) L[i]=L[i-1];
else L[i]=0;
}
for(int i=n-1;i>=1;i--)
{
if(a[i]>a[i+1]) R[i]=R[i+1]+1;
else if(a[i]==a[i+1]) R[i]=R[i+1];
else R[i]=0;
}
ll sum=0;
for(int i=1;i<=n;i++) sum+=max(L[i],R[i])+1ll;
cout<<sum<<endl;
return 0;
}
Vamos duro, ( o ) / ~