http://codeforces.com/contest/653/problem/C
题意:
给n,给n个数。
要求一个合法序列满足: 偶数项>奇数项,奇数项<偶数项
给一个序列,要求交换仅一对数,使得原序列变成合法序列
问你有多少种方案
扫一遍 看有多少个位置不符合要求,也就是 偶数项《奇数项,奇数项》偶数项的,我们把后一项坐标记录起来。
如果这样的坐标如果超过2个,显然无法一次交换解决。
如果flag==1,则 枚举 x,和x-1 能和谁交换,注意 与自己相邻的坐标交换要注意左右会变化
如果flag==2,则枚举 x-1,x 和 y,y-1分别交换的四种情况,注意 与自己相邻的坐标交换要注意左右会变化
然后就完了。。。。代码写得太挫了、、、
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
int min(int a,int b)
{return a<b?a:b;}
int max(int a,int b)
{return a>b?a:b;}
int tm[150005];
int wa[150005];
int main()
{
int i,j;
int n;cin>>n;
for (i=1;i<=n;i++)
scanf("%d",&tm[i]);
if (n%2) tm[n+1]=150005;
else tm[n+1]=0;
tm[0]=150005;
int flag=0;
for (i=2;i<=n;i++)
{
if (i%2)
{
if (tm[i]>=tm[i-1])
{wa[++flag]=i;i++;}
}
else
{
if (tm[i]<=tm[i-1])
{ wa[++flag]=i;i++;}
}
}
if (flag>2) {printf("0\n");return 0;}
if (flag==1)
{
int sum=0;
for (int k=1;k<=2;k++)
for (i=1;i<=n;i++)
{
int x;
if (k==1) x=wa[1];
else x=wa[1]-1;
if (i==x) continue;
if (k==2)
{
if (x%2)
{if (tm[x+1]<tm[x+2]) break;}
else
{ if (tm[x+1]>tm[x+2]) break;}
}
if (i==x+1&&k==1)
{
if (x%2==0)
{
if (tm[i]>tm[x]&&tm[i]>tm[x-1])
if (tm[x]<tm[i]&&tm[x]<tm[i+1])
sum++;
}
else
{
if (tm[i]<tm[x]&&tm[i]<tm[x-1])
if (tm[x]>tm[i]&&tm[x]>tm[i+1])
sum++;
}
}
if (i==x-1)
{
if (x%2==0)
{
if (tm[i]>tm[x]&&tm[i]>tm[x+1])
if (tm[x]<tm[i]&&tm[x]<tm[i-1])
sum++;
}
else
{
if (tm[i]<tm[x]&&tm[i]<tm[x+1])
if (tm[x]>tm[i]&&tm[x]>tm[i-1])
sum++;
}
}
else
if (i%2)
{
if (tm[x]<tm[i-1]&&tm[x]<tm[i+1])
{
if (x%2)
{
if (tm[i]<tm[x-1]&&tm[i]<tm[x+1])
sum++;
}
else
{
if (tm[i]>tm[x-1]&&tm[i]>tm[x+1])
sum++;
}
}
}
else
{
if (tm[x]>tm[i-1]&&tm[x]>tm[i+1])
{
if (x%2)
{
if (tm[i]<tm[x-1]&&tm[i]<tm[x+1])
sum++;
}
else
{
if (tm[i]>tm[x-1]&&tm[i]>tm[x+1])
sum++;
}
}
}
}
printf("%d\n",sum); return 0;
}
//swap(wa[1],wa[2]);
int sum=0;
int x1=wa[1];
int x2=wa[2];
for (i=1;i<=4;i++)
{
if (i==2){x1=wa[1]-1; x2=wa[2];}
if (i==3) {x1=wa[1];x2=wa[2]-1;}
if (i==4) {x1=wa[1]-1;x2=wa[2]-1;}
if (x1>x2) swap(x1,x2);
if (x1==x2-1)
{
if (x2%2==0)
{
if (tm[x1]>tm[x2]&&tm[x1]>tm[x2+1])
if (tm[x2]<tm[x1]&&tm[x2]<tm[x1-1])
sum++;
}
else
{
if (tm[x1]<tm[x2]&&tm[x1]<tm[x2+1])
if (tm[x2]>tm[x1]&&tm[x2]>tm[x1-1])
sum++;
}
}
if (x1%2)
if (tm[x2]<tm[x1-1]&&tm[x2]<tm[x1+1])
{
if (x2%2&&tm[x1]<tm[x2-1]&&tm[x1]<tm[x2+1])
sum++;
if (x2%2==0&&tm[x1]>tm[x2-1]&&tm[x1]>tm[x2+1])
sum++;
}
if (x1%2==0)
if (tm[x2]>tm[x1-1]&&tm[x2]>tm[x1+1])
{
if (x2%2&&tm[x1]<tm[x2-1]&&tm[x1]<tm[x2+1])
sum++;
if (x2%2==0&&tm[x1]>tm[x2-1]&&tm[x1]>tm[x2+1])
sum++;
}
}
printf("%d\n",sum);
return 0;
}