题意:给定长度为n的数组a,可以进行以下操作:选择一个位置i,并且ai=a的长度+1-i;在a的末尾添加i-1个零,多次执行操作后数组a的最大可能长度是多少
分析:ai=|a|-i+1,所以|a|=ai+i-1,用map记录每个点都需要多少长度才可以变,记得vis开大点不然放不下
代码:
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e6+10;
ll a[N];
map<ll,bool>vis;
ll ans=0;ll n;
map<ll,vector<ll>>mp;
void dfs(ll x){
vis[x]=1;
ans=max(ans,x);
for(auto &xx:mp[x]){
if(vis[x+xx-1]==0){
dfs(x+xx-1);
}
}
}
void sol(){
cin>>n;
mp.clear();ans=0;
vis.clear();
for(int i=1;i<=n;i++){
cin>>a[i];
if(i>1)mp[a[i]+i-1].push_back(i);
}
dfs(n);
cout<<ans<<endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--)sol();
return 0;
}