A Permutation Warm-Up
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
#ifdef DEBUG
#define _GLIBCXX_DEBUG
#endif
#define DEBUG
int recur_depth = 0;
#ifdef DEBUG
#define dbg(x) {++recur_depth; auto x_=x; --recur_depth; cerr<<string(recur_depth, '\t')<<"\e[91m"<<__func__<<":"<<__LINE__<<"\t"<<#x<<" = "<<x_<<"\e[39m"<<endl;}
#else
#define dbg(x)
#endif
template<typename Ostream, typename Cont>
typename enable_if<is_same<Ostream,ostream>::value, Ostream&>::type operator<<(Ostream& os, const Cont& v){
os<<"[";
for(auto& x:v){os<<x<<", ";}
return os<<"]";
}
template<typename Ostream, typename ...Ts>
Ostream& operator<<(Ostream& os, const pair<Ts...>& p){
return os<<"{"<<p.first<<", "<<p.second<<"}";
}
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);
int T=read();
while(T--) {
ll n=read(),p=0;
For(i,n) p+=abs(n-i+1-i);
cout<<p/2+1<<endl;
}
return 0;
}
B SUMdamental Decomposition
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
#ifdef DEBUG
#define _GLIBCXX_DEBUG
#endif
#define DEBUG
int recur_depth = 0;
#ifdef DEBUG
#define dbg(x) {++recur_depth; auto x_=x; --recur_depth; cerr<<string(recur_depth, '\t')<<"\e[91m"<<__func__<<":"<<__LINE__<<"\t"<<#x<<" = "<<x_<<"\e[39m"<<endl;}
#else
#define dbg(x)
#endif
template<typename Ostream, typename Cont>
typename enable_if<is_same<Ostream,ostream>::value, Ostream&>::type operator<<(Ostream& os, const Cont& v){
os<<"[";
for(auto& x:v){os<<x<<", ";}
return os<<"]";
}
template<typename Ostream, typename ...Ts>
Ostream& operator<<(Ostream& os, const pair<Ts...>& p){
return os<<"{"<<p.first<<", "<<p.second<<"}";
}
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);
int T=read();
while(T--) {
ll n=read(),x=read();
if(n==1) {
if(x) cout<<x<<endl;
else puts("-1");
continue;
}
ll ans=x;
vi v;
Rep(i,31) if(x&(1<<i)) v.pb(1<<i);
int t=SI(v);
if(n<=t) {
cout<<x<<endl; continue;
}
ll lef=n-t;
if(lef>=2) ans+=lef/2*2,lef%=2;
if(!lef) {
cout<<ans<<endl; continue;
}
if(t>0 && v[t-1]!=1 ) {
ans+=2;cout<<ans<<endl; continue;
}
else {
cout<<ans+4<<endl;
}
}
return 0;
}
C Neo’s Escape
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
#ifdef DEBUG
#define _GLIBCXX_DEBUG
#endif
#define DEBUG
int recur_depth = 0;
#ifdef DEBUG
#define dbg(x) {++recur_depth; auto x_=x; --recur_depth; cerr<<string(recur_depth, '\t')<<"\e[91m"<<__func__<<":"<<__LINE__<<"\t"<<#x<<" = "<<x_<<"\e[39m"<<endl;}
#else
#define dbg(x)
#endif
template<typename Ostream, typename Cont>
typename enable_if<is_same<Ostream,ostream>::value, Ostream&>::type operator<<(Ostream& os, const Cont& v){
os<<"[";
for(auto& x:v){os<<x<<", ";}
return os<<"]";
}
template<typename Ostream, typename ...Ts>
Ostream& operator<<(Ostream& os, const pair<Ts...>& p){
return os<<"{"<<p.first<<", "<<p.second<<"}";
}
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);
int T=read();
while(T--) {
ll n=read();
vi a(n);
Rep(i,n) a[i]=read();
a.erase(unique(ALL(a)),a.end());
n=SI(a);
vector<pair<int,int> > v2;
Rep(i,n) v2.pb(mp(a[i],i));
sort(ALL(v2));
vector<bool> b(n);
int ans=0;
RepD(i,n-1) {
auto now=v2[i];
int j=now.se;
if((j<n &&b[j+1])|| (j>0&&b[j-1])){
}else {
++ans;
}
b[j]=1;
}
cout<<ans<<endl;
}
return 0;
}
D Needle in a Numstack
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
#ifdef DEBUG
#define _GLIBCXX_DEBUG
#endif
#define DEBUG
int recur_depth = 0;
#ifdef DEBUG
#define dbg(x) {++recur_depth; auto x_=x; --recur_depth; cerr<<string(recur_depth, '\t')<<"\e[91m"<<__func__<<":"<<__LINE__<<"\t"<<#x<<" = "<<x_<<"\e[39m"<<endl;}
#else
#define dbg(x)
#endif
template<typename Ostream, typename Cont>
typename enable_if<is_same<Ostream,ostream>::value, Ostream&>::type operator<<(Ostream& os, const Cont& v){
os<<"[";
for(auto& x:v){os<<x<<", ";}
return os<<"]";
}
template<typename Ostream, typename ...Ts>
Ostream& operator<<(Ostream& os, const pair<Ts...>& p){
return os<<"{"<<p.first<<", "<<p.second<<"}";
}
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
ll a[1123456];
ll b[1123456];
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);
int T;
fflush(stdout);
cin>>T;
while(T--) {
fflush(stdout);
ll n,k;cin>>n>>k;
if(2*k==n) {
cout<<"! "<<k<<' '<<k<<endl;
continue;
}
For(i,k) {
cout<<"? "<<i<<endl;
fflush(stdout);
cin>>a[i];
}
Fork(i,k+1,n) a[i]=a[i-k];
Fork(i,n-k+1,n) {
cout<<"? "<<i<<endl;
fflush(stdout);
cin>>b[i];
}
ForD(i,n-k) b[i]=b[i+k];
vi v;
Fork(i,k+1,n-k) {
if(a[i]^b[i]) v.pb(i);
}
int l=0,r=SI(v)-1,an=-1;
while(l<=r) {
int m=l+r>>1,t,pos=v[m];
cout<<"? "<<pos<<endl;
fflush(stdout);
cin>>t;
if(t==a[pos]) l=m+1,an=m;else r=m-1;
}
if(an==-1) an=k;else an=v[an];
if(an+1>n-k|| a[an+1]!= b[an+1] ) {
cout<<"! "<<an<<' '<<n-an<<endl;
}else cout<<"! -1"<<endl;
fflush(stdout);
}
return 0;
}
E Spruce Dispute
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
#ifdef DEBUG
#define _GLIBCXX_DEBUG
#endif
#define DEBUG
int recur_depth = 0;
#ifdef DEBUG
#define dbg(x) {++recur_depth; auto x_=x; --recur_depth; cerr<<string(recur_depth, '\t')<<"\e[91m"<<__func__<<":"<<__LINE__<<"\t"<<#x<<" = "<<x_<<"\e[39m"<<endl;}
#else
#define dbg(x)
#endif
template<typename Ostream, typename Cont>
typename enable_if<is_same<Ostream,ostream>::value, Ostream&>::type operator<<(Ostream& os, const Cont& v){
os<<"[";
for(auto& x:v){os<<x<<", ";}
return os<<"]";
}
template<typename Ostream, typename ...Ts>
Ostream& operator<<(Ostream& os, const pair<Ts...>& p){
return os<<"{"<<p.first<<", "<<p.second<<"}";
}
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
#define MAXN (212345)
ll b[MAXN],n,p[MAXN],cal=0;
vi v[MAXN];
int sz[MAXN],dis[MAXN];
void dfs(int x,int fa) {
sz[x]=0;
for (auto u:v[x])
if (u!=fa) {
dfs(u,x);
sz[x]+=sz[u];
}
sz[x]++;
}
int now;
void dfs2(int x,int fa) {
bool b=(n-sz[x])<=n/2;
for (auto u:v[x])
if (u!=fa) {
b&=(sz[u]<=n/2);
dfs2(u,x);
}
if(b){
now=x;
}
}
vector<vector<int> > vp;
int fa[MAXN];
void dfs3(int x,int fa,int pr=-1) {
::fa[x]=fa;
for (auto u:v[x])
if (u!=fa) {
dis[u]=dis[x]+1;
dfs3(u,x,(x==now)?u:pr);
}
if(pr!=-1) vp[pr].pb(x);
}
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);
int T=read();
while(T--) {
n=read();
For(i,n-1) {
int x=read(),y=read();
v[x].pb(y); v[y].pb(x);
}
dfs(1,-1);
dfs2(1,-1);
dis[now]=0;
vp.resize(n+1);
dfs(now,-1);
dfs3(now,-1,-1);
int tot=0,p=-1;
For(i,n) if(i!=now ){
if (p==-1 || dis[i]+sz[i]<dis[p]+sz[p]) p=i;
}
// assert(v[p].size()==1);
cout<<fa[p]<<' '<<p<<endl;
bool flag=0;
// dbg(vp)
For(i,n) if(!flag){
for(auto it=vp[i].begin();it!=vp[i].end();it++) {
if((*it)==p) {
vp[i].erase(it);
flag=1;
break;
}
}
}
// dbg(vp)
vi ans(n+1,0);
set<pair<int,int> > S;
For(i,n) if(SI(vp[i])) S.insert(mp(SI(vp[i]),i));
// dbg(S)
while(!S.empty()) {
auto it=S.end();it--;
if(SI(S)==1) {
int pos1=vp[it->se][(it->fi)-1];
int pos2=now;
ans[pos1]=ans[pos2]=++tot;
break;
}
auto it2=it; it--;
int pos1=vp[it->se][(it->fi)-1];
int pos2=vp[it2->se][(it2->fi)-1];
ans[pos1]=ans[pos2]=++tot;
if((it->fi)-1>0 )S.insert(mp((it->fi)-1, it->se));
if((it2->fi)-1>0 )S.insert(mp((it2->fi)-1, it2->se));
S.erase(it);
S.erase(it2);
}
if(p<fa[p]) {
swap(ans[p],ans[fa[p]]);
}
PRi(ans,n)
For(i,n) v[i].resize(0);
vp.resize(0);
}
return 0;
}
F Fallen Towers
皮萨诺建造了由 nnn 座塔楼组成的 aaa 阵列,每座塔楼由 ai≥0a_i \ge 0ai≥0 块砖块组成。
皮扎诺可以推倒一座塔,使接下来的 aia_iai 座塔增加 111 个。换句话说,他可以利用 aia_iai 元素,将接下来的 aia_iai 元素增加一个,然后将 aia_iai 设为 000 。落在塔阵列之外的图块就会消失。如果皮萨诺撞倒了一个有 000 个积木的塔,那么什么也不会发生。
皮扎诺想要按照任意顺序推倒所有 nnn 个塔楼,每个塔楼**次。也就是说,从 111 到 nnn 的每一个 iii ,他都要精确地推倒位置 iii 的塔一次。
此外,所得到的塔高度数组必须是不递减的。这意味着当他推倒所有 nnn 座塔之后,对于任意 KaTeX parse error: Expected 'EOF', got '&' at position 3: i &̲lt; j 座塔,位置 iii 处的塔一定不会比位置 jjj 处的塔更高。
您需要输出所得到的塔楼高度数组中最大的 MEX\text{MEX}MEX 。
数组的 MEX\text{MEX}MEX 是数组中不存在的最小非负整数。
假设最后的结果可以为[r1,r2,⋯ ,rn][r_1,r_2,\cdots,r_n][r1,r2,⋯,rn],那么[r1′,r2′,⋯ ,rn′][r'_1,r'_2,\cdots,r'_n][r1′,r2′,⋯,rn′]也可以,其中ri′≤rir'_i\le r_iri′≤ri
用数学归纳法,假设k-1的情况成立,ri′≤ri,si′≥sir'_i \le r_i,s_i' \ge s_iri′≤ri,si′≥si,其中sis_isi表示倒在iii塔上的塔数。
考虑钱k-1座塔已经处理完毕。
ai+si(k−1)−ri′≥ai+(si−ri)a_i + s^{(k - 1)}_i - r'_i \ge a_i + (s_i - r_i)ai+si(k−1)−ri′≥ai+(si−ri)
考虑最后结果中的最后一座塔的取值范围,它被推倒的时间和后面有几个塔倒在它上面,显然无论前n-1座塔如何,它的取值范围是[0,x]这样的形式。
最后问题转为能否凑出0,0,0,⋯ ,1,2,30,0,0,\cdots,1,2,30,0,0,⋯,1,2,3这种数组。
可以线性推导sis_isi求是否合法。
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
#ifdef DEBUG
#define _GLIBCXX_DEBUG
#endif
#define DEBUG
int recur_depth = 0;
#ifdef DEBUG
#define dbg(x) {++recur_depth; auto x_=x; --recur_depth; cerr<<string(recur_depth, '\t')<<"\e[91m"<<__func__<<":"<<__LINE__<<"\t"<<#x<<" = "<<x_<<"\e[39m"<<endl;}
#else
#define dbg(x)
#endif
template<typename Ostream, typename Cont>
typename enable_if<is_same<Ostream,ostream>::value, Ostream&>::type operator<<(Ostream& os, const Cont& v){
os<<"[";
for(auto& x:v){os<<x<<", ";}
return os<<"]";
}
template<typename Ostream, typename ...Ts>
Ostream& operator<<(Ostream& os, const pair<Ts...>& p){
return os<<"{"<<p.first<<", "<<p.second<<"}";
}
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
void work() {
int n=read();
vi a(n);
Rep(i,n) a[i]=read();
auto check = [&](int x) { //mex=x
vi d(n);
Rep(i,n) {
int p=max(0,x-(n-i));
if(i) d[i]+=d[i-1];
if(d[i]<p) return 0;
int len=a[i]+d[i]-p;
if(i+1<n) d[i+1]++;
if(i+len+1<n)d[i+len+1]--;
}
return 1;
};
int l=0,r=n,an;
while(l<=r) {
int m=l+r>>1;
if(check(m)) an=m,l=m+1;else r=m-1;
}
cout<<an<<endl;
}
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);
int T=read();
while(T--) {
work();
}
return 0;
}