Codeforces 653C Bear and Up-Down【暴力】
题目链接:
http://codeforces.com/problemset/problem/653/C
题意:
给定序列,偶数位的数字比两边都大,则成为nice,只可以交换两个数字,问有多少种交换方式使得最后的序列为nice。
分析:
比赛的时候找规律,找呀找了好久都没看出来。。。。由于只可以交换一次,交换两个数字,所以最多改变的6个数字的关系。那么可以交换成nice的话,原来不满足的肯定很少,直接把这些数字提出来,然后暴力的和序列每个元素交换一下,看看其余不满足的是否变成满足就好啦~~~
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1500005;
int t[maxn];
vector<int>v;
typedef pair<int, int>pii;
map<pii, int>vis;
int n;
bool judge(int b)
{
if(b & 1) {
if(b < n - 1) return t[b - 1] < t[b] && t[b + 1] < t[b];
else return t[b - 1] < t[b];
}
else if(b > 0 && b < n - 1) return t[b - 1] > t[b] && t[b + 1] > t[b];
else if(b == 0) return t[b + 1] > t[b];
else return t[b - 1] > t[b];
}
int main (void)
{
cin>>n;
for(int i = 0; i < n; i++){
cin>>t[i];
}
for(int i =0; i < n; i += 2){
if(i == 0 && t[i] >= t[i + 1]){
v.push_back(i);v.push_back(i + 1);
}
if(i == n - 1 && t[i] >= t[ i - 1]){
v.push_back(i);v.push_back(i - 1);
}
else if(i > 0 && i < n - 1){
if( t[i] >= t[i + 1]){
v.push_back(i);v.push_back(i + 1);
}
else if(t[i] >= t[i - 1]){
v.push_back(i);v.push_back(i - 1);
}
else if( t[i] >= t[i + 1] && t[i] >= t[i - 1]){
v.push_back(i);v.push_back(i - 1);v.push_back(i + 1);
}
}
}
int cnt = 0;
if(v.size() > 10){
cout<<0<<endl;
return 0;
}
for(int i = 0; i < v.size(); i++){
for(int j = 0; j < n; j++){
if(t[j] != t[v[i]]){
swap(t[j], t[v[i]]);
bool ok = true;
for(int k = 0; k < v.size(); k++){
if(!judge(v[k])) ok = false;
}
if(!judge(j)) ok = false;
if(ok){
// cout<<t[i]<<' '<<t[j]<<endl;
pii p = pii(min(v[i], j),max(v[i],j));
if(!vis[p]){vis[p] = 1; cnt++;}
}
swap(t[v[i]], t[j]);
}
}
}
cout<<cnt<<endl;
return 0;
}