Suma máxima de HDU de cola monotónica de la subsecuencia Max-K

  • Suma máxima de la subsecuencia Max-K

  • Significado
    de la pregunta Dada una secuencia circular con N números (N <= 10 ^ 5), le permite encontrar una subsecuencia continua con la suma más grande. La longitud de esta subsecuencia continua es menor o igual que K.


  • El blog de este tipo grande del que tomó prestada la idea. Después de
    leer la idea, llamé a WA. Luego miré el código del grandullón, pero no lo entendí del todo. Lo atravesé. ¿Por qué se operaría sum [i-1]? Cuando pedí tmp, usé sum [i] nuevamente. Más tarde quise entender. .
    Si se atraviesa i, la cola monótona se usa para mantener el intervalo [suma [i - k], suma [i + 1 - k] ..., Suma [i - 1]] [suma [ik], suma [i + 1 -k] ..., suma [i-1]][ s u m [ yo-k ] ,s u m [ yo+1-k ] . . . ,s u m [ yo-1 ] ] El valor mínimo de estos k números, el subíndice de este valor mínimo es el punto final izquierdo del intervalo que satisface la condición, ei es el punto final derecho. El tamaño de este intervalo es menor o igual que k. Considere el caso extremosuma [i - k] suma [ik]s u m [ yo-k ]的 值 最小 , tmp =suma [i] - suma [i - k] suma [i] -sum [ik]s u m [ i ]-s u m [ yo-El valor de k ] es la suma de los k números [i-k + 1, i] en la secuencia. Entonces, cada vez que intento completar la cola, se usa sum [i-1] y sum [i] cuando se busca tmp al final.

  • Código

#pragma GCC optimize(2)
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long ul;
typedef unsigned long long ull;
#define pi acos(-1.0)
#define e exp(1.0)
#define pb push_back
#define mk make_pair
#define fir first
#define sec second
#define scf scanf
#define prf printf
typedef pair<ll,ll> pa;
const ll INF=0x3f3f3f3f3f3f3f3f;
const ll MAX_T=120;
const ll MAX_N=1e5+7;
ll a[MAX_N],sum[MAX_N<<1],N,K,T;
deque<ll>DQ;
int main()
{
    
    
//  freopen(".../.txt","w",stdout);
//  freopen(".../.txt","r",stdin);
   ios::sync_with_stdio(false);
   cin>>T;
   while(T--){
    
    
   	cin>>N>>K;
   	DQ.clear();
   	ll i,j,k,maxx=-INF,resl=-1,resr=-1;
   	sum[0]=0;
   	for(i=1;i<=N;i++){
    
    
   		cin>>a[i];
   		sum[i]=sum[i-1]+a[i];
   	}
   	for(i=1;i<=K;i++){
    
    
   		sum[i+N]=sum[i+N-1]+a[i]; 
   	}
   	for(i=1;i<=N+K-1;i++){
    
    
   		while(!DQ.empty()&&sum[i-1]<sum[DQ.back()]){
    
    
   			DQ.pop_back();
   		} 
   		DQ.push_back(i-1);
   		while(!DQ.empty()&&i-DQ.front()>K){
    
    
   			DQ.pop_front();
   		}
   		ll tmp=sum[i]-sum[DQ.front()]; 
   		if(tmp>maxx){
    
    
   			maxx=tmp;
   			resl=DQ.front()+1;
   			resr=i;
   		}
   	}
   	cout<<maxx<<" "<<(resl-1+N)%N+1<<" "<<(resr-1+N)%N+1<<endl;
   }
   return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43311695/article/details/108734060
Recomendado
Clasificación