HDU Max Sum of Max-K-sub-sequence Monotonic queue

  • Somme maximale de la sous-séquence Max-K

  • Signification
    de la question Étant donné une séquence circulaire avec N nombres (N <= 10 ^ 5), vous permet de trouver une sous-séquence continue avec la plus grande somme. La longueur de cette sous-séquence continue est inférieure ou égale à K.


  • Le blog de ce grand gars auquel l' idée a emprunté Après avoir
    lu l'idée, j'ai frappé WA. Ensuite, j'ai regardé le code du grand gars, mais je ne l'ai pas très bien compris. Je l'ai parcouru. Pourquoi est-ce que sum [i-1] serait opéré? Quand j'ai demandé tmp, j'ai utilisé à nouveau sum [i]. Plus tard j'ai voulu comprendre. .
    Si i est parcouru, la file d'attente monotone est utilisée pour maintenir l'intervalle [somme [i - k], somme [i + 1 - k] ..., somme [i - 1]] [somme [ik], somme [i + 1 -k] ..., somme [i-1]][ s u m [ i-k ] ,s u m [ i+1-k ] . . . ,s u m [ i-1 ] ] La valeur minimale de ces k nombres, l'indice de cette valeur minimale est le point final gauche de l'intervalle qui satisfait la condition, et i est le point final droit. La taille de cet intervalle est inférieure ou égale à k. Considérons lasomme descas extrêmes[i - k] somme [ik]s u m [ i-k ]的 值 最小 , tmp =somme [i] - somme [i - k] somme [i] -somme [ik]s u m [ i ]-s u m [ i-La valeur de k ] est la somme des k nombres [i-k + 1, i] dans la séquence. Ainsi, chaque fois que j'essaye de remplir la file d'attente, sum [i-1] est utilisé, et sum [i] est utilisé lors de la recherche de tmp à la fin.

  • Code

#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;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43311695/article/details/108734060
conseillé
Classement