呜呜呜┭┮﹏┭┮,ARC太难了,只会 A 题。
emmmm,乍一看:不就是0,1,2三种情况吗?0,2好判段,直接看1不就行了?然后写出了这个代码↓
#include <bits/stdc++.h>
using namespace std;
#define int long long
int P[200005];
signed main(){
int T;
cin>>T;
while(T--){
int N;
cin>>N;
bool flag=true;
for(int i=1;i<=N;i++){
cin>>P[i];
if(P[i]!=i)
flag=false;
}
if(flag){
cout<<0<<endl;
continue;
}
int ans=2,sum=0;
for(int i=1;i<=N;i++){
sum+=P[i];
if(sum==i*(i+1)/2 && P[i+1]==i+1){
ans=1;
break;
}
}
cout<<ans<<endl;
}
return 0;
}
得到了的好成绩。
当然,你也可以通过看最大最小值来判断 1 的情况。最终的代码就是用的最大最小值判断的。
WHY? 当我拿出 5 4 3 2 1 这组数据时,阁下又该如何应对呢?
显然,最多需要 3 次。那么 3 次是什么情况呢?我再给你一些数据:
5 4 2 3 1
7 5 6 2 3 4 1
5 2 4 3 1
6 4 5 3 2 1
我们发现,这些数据的共同点是并且
,所以这题就结束啦。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int P[200005];
int main(){
int T;
cin>>T;
while(T--){
int N,flag=1;
cin>>N;
for(int i=1;i<=N;i++){
cin>>P[i];
if(P[i]!=i)
flag=0;
}
if(flag){
cout<<0<<endl;
continue;
}
if(P[N]==1 && P[1]==N){
cout<<3<<endl;
continue;
}
int ans=2,mn=min(mn,min(P[1],P[2])),mx=max(mx,max(P[1],P[2]));
if(P[1]==1)
ans=1;
else{
for(int i=2;i<=N;i++){
if(mn==1 && mx==(i-1) && P[i]==i){
ans=1;
break;
}
mn=min(mn,P[i]);
mx=max(mx,P[i]);
}
}
cout<<ans<<endl;
}
return 0;
}
最后rk 2302,又上分哩(主要原来没打过,所以现在上分很容易,估计过几天就不行咯)(*^▽^*)
友情提醒:不要Ctrl C+Ctrl V