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