【题意】
一个序列定义为nice的话,就是这个序列满足阶梯状。
就是如果i是偶数,那么ai>ai-1,ai>ai+1
如果i是奇数,那么ai<ai+1,ai<ai-1
现在允许你交换两个数的位置,问你一共有多少种交换方式,使得这个序列变成nice
保证一开始的序列不是nice的。
【解题思路】
我们定义不nice的数就是不满足条件的位置。
我们可以大胆猜测一发,不nice的数一定不会有很多,因为一次交换最多影响6个数,所以我们把这些不nice的数直接扔到一个数组里面。
然后暴力去和整个序列去交换就好了。
然后check也是只用check那些不nice的位置和你交换的那个位置的数。
【AC代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=150005;
int a[maxn];
vector<int>v;
set<pair<int,int> >S;
bool check()
{
for(int i=0; i<(int)v.size(); i++)
{
int pos = v[i];
if(pos&1)
{
if(a[pos]>=a[pos+1])return false;
if(a[pos]>=a[pos-1])return false;
}
else
{
if(a[pos]<=a[pos+1])return false;
if(a[pos]<=a[pos-1])return false;
}
}
return true;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)scanf("%d",&a[i]);
a[0]=1e9;
if(n%2==1) a[n+1]=1e9;
else a[n+1]=-1;
for(int i=1;i<=n;i++)
{
if( i & 1 ){
bool ok = true;
if( i + 1 <= n && a[i] >= a[i+1] ) ok = false;
if( i - 1 >= 1 && a[i] >= a[i-1] ) ok = false;
if( ok == false ) v.push_back( i );
}else{
bool ok = true;
if( i + 1 <= n && a[i] <= a[i+1] ) ok = false;
if( i - 1 >= 1 && a[i] <= a[i-1] ) ok = false;
if( ok == false ) v.push_back( i );
}
}
int ans = 0;
if(v.size()>10)
{
puts("0");
return 0;
}
//cout<<v.size()<<endl;
for(int i=0;i<(int)(v.size());i++)
{
for(int j=1; j<=n; j++)
{
if(v[i]==j)continue;
swap(a[v[i]],a[j]);
bool ok = check();
if(j&1)
{
if(a[j]>=a[j+1]||a[j]>=a[j-1])ok=false;
}
else
if(a[j]<=a[j+1]||a[j]<=a[j-1])ok=false;
if(ok)
{
pair<int,int>p = make_pair(min(v[i],j),max(v[i],j));
if(!S.count(p))
{
S.insert(p);
ans++;
}
}
swap(a[v[i]],a[j]);
}
}
printf("%d\n",ans);
return 0;
}