解析:
真的有毒。。。早知道就不去推E题了
感觉这就是一个乱搞题,有 O ( n ) O(n) O(n)算法的乱搞题。。。
首先我们明确一点,一个位置上的数要么换走,要么不换,换走的就没有再换回来的必要了。
考虑哪些区间需要换,再check一下就ok了。。。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define st static
#define cs const
inline
ll getint(){
re ll num=0;
re char c=gc();
while(!isdigit(c))c=gc();
while(isdigit(c))num=(num<<1)+(num<<3)+(c^48),c=gc();
return num;
}
int n,a[300005];
inline
bool check(int l,int r){
int maxn=0,minn=n+1;
for(int re i=l;i<=r;++i){
maxn=max(maxn,a[i]);
minn=min(minn,a[i]);
}
if(maxn!=r||minn!=l)return false;
int submaxn=0;
maxn=0;
for(int re i=l;i<=r;i+=2){
if(maxn<a[i])maxn=a[i];
else if(submaxn<a[i])submaxn=a[i];
else return false;
}
return true;
}
int main(){
n=getint();
for(int re i=1;i<=n;++i){
a[i]=getint();
}
for(int re i=1;i<=n;++i){
if(a[i]==i)continue;
int p;
for(p=i;p<=n-2;p+=2){
if(a[p+1]!=p+1||a[p+2]==p+2)break;
}
if(!check(i,p)){
puts("No");
return 0;
}
i=p;
}
puts("Yes");
return 0;
}