CF2144B Maximum Cost Permutation
题目传送门
思路
首先我们先增加一个特判:如果在整个序列中只有
如果我们想让这个排列的代价最大,那么我们需要使得这个满足条件的子段的最左端点和最右端点放上的数不是它自身。
此时可以放一个左端点和右端点,左端点从
关键代码:
int l=1,r=n;
//注意保证不越界
while(l<=n && a[l]==l) l++;
while(r>=1 && a[r]==r) r--;
但此时不能直接输出
AC Code:
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N];
bool vis[N];
void solve()
{
memset(vis,0,sizeof vis);
int n;
cin >>n;
int cnt=0;
for(int i=1;i<=n;i++)
{
cin >>a[i];
if(a[i]==0) cnt++;
}
if(cnt==1)
{
int p;
for(int i=1;i<=n;i++)
{
if(a[i]==0)
{
p=i;
break;
}
}
for(int i=1;i<=n;i++) vis[a[i]]=1;
for(int i=1;i<=n;i++)
{
if(vis[i]==0) a[p]=i;
}
}
int l=1,r=n;
while(l<=n && a[l]==l) l++;
while(r>=1 && a[r]==r) r--;
cout <<max(0,r-l+1)<<'\n';
}
int main()
{
int t;
cin >>t;
while(t--)
{
solve();
}
return 0;
}