給定長度為n的序列和數字s,找出最長的區間[l,r][l,r][l,r],使得?i∈[l,r],prei?prel?1+s≥0\forall i \in [l,r], pre_i-pre_{l-1}+s \geq0?i∈[l,r],prei??prel?1?+s≥0,其中preipre_iprei?表示前綴和
思路 :
考慮雙指針,對某一段[l,r][l,r][l,r]區間滿足答案要求,則更新答案,且右指針移動
若右指針移動后不滿足條件,則不斷移動左指針直到滿足條件
注意如何設置初始值,來應對無解的情況
#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<unordered_set>#include<math.h>usingnamespace std;typedeflonglong ll;//typedef pair<int, int> PII;#defineendl'\n'#definefifirst#definesesecond#definepush_back#definerep(i, l, r)for(ll i = l; i <= r; i ++)#defineintlonglongconstint N =2e5+10;int a[N];voidsolve(){int n, s; cin >> n >> s;for(int i =1; i <= n && cin >> a[i]; i ++) a[i]+= a[i -1];int l =1, r =0;for(int j =1, i =1; j <= n; j ++){while(i <= j && a[j]- a[i -1]+ s <0) i ++;if(r - l +1< j - i +1)l = i, r = j;}if(r ==0) cout <<-1<< endl;else cout << l <<' '<< r << endl;}signedmain(){cin.tie(nullptr)->sync_with_stdio(false);int _;cin >> _;while(_ --)solve();// return 0;}#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<unordered_set>#include<math.h>usingnamespace std;//typedef long long ll;typedef pair<int,int> PII;#defineendl'\n'#definefifirst#definesesecond#definepush_back#definerep(i, l, r)for(ll i = l; i <= r; i ++)#defineintlonglongconstint N =2e5+10;int n, s;int a[N];int l, r, ansl, ansr, sum;voidinit(){l = r =1, sum =0, ansl = ansr =-1;}voidupdate(){if(r - l > ansr - ansl) ansl = l, ansr = r;}voidsolve(){cin >> n >> s;for(int i =1; i <= n && cin >> a[i]; i ++);init();while(l <= n && r <= n +1){if(sum + s >=0)update(), sum += a[r ++];else sum -= a[l ++];}if(ansr ==-1) cout <<-1<< endl;else cout << ansl <<' '<< ansr -1<< endl;}signedmain(){cin.tie(nullptr)->sync_with_stdio(false);int _;cin >> _;while(_ --)solve();// return 0;}