IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C. Bear and Up-Down 暴力
題目連接:
http://www.codeforces.com/contest/653/problem/C
Description
The life goes up and down, just like nice sequences. Sequence t1,?t2,?...,?tn is called nice if the following two conditions are satisfied:
ti?<?ti?+?1 for each odd i?<?n;
ti?>?ti?+?1 for each even i?<?n.
For example, sequences (2,?8), (1,?5,?1) and (2,?5,?1,?100,?99,?120) are nice, while (1,?1), (1,?2,?3) and (2,?5,?3,?2) are not.
Bear Limak has a sequence of positive integers t1,?t2,?...,?tn. This sequence is not nice now and Limak wants to fix it by a single swap. He is going to choose two indices i?<?j and swap elements ti and tj in order to get a nice sequence. Count the number of ways to do so. Two ways are considered different if indices of elements chosen for a swap are different.
Input
The first line of the input contains one integer n (2?≤?n?≤?150?000) — the length of the sequence.
The second line contains n integers t1,?t2,?...,?tn (1?≤?ti?≤?150?000) — the initial sequence. It's guaranteed that the given sequence is not nice.
Output
Print the number of ways to swap two elements exactly once in order to get a nice sequence.
Sample Input
5
2 8 4 7 7
Sample Output
2
Hint
題意
一個序列定義為nice的話,就是這個序列滿足階梯狀。
就是如果i是偶數,那么ai>ai-1,ai>ai+1
如果i是奇數,那么ai<ai+1,ai<ai-1
現在允許你交換兩個數的位置,問你一共有多少種交換方式,使得這個序列變成nice
保證一開始的序列不是nice的。
題解:
我們定義不nice的數就是不滿足條件的位置。
我們可以大膽猜測一發,不nice的數一定不會有很多,因為一次交換最多影響6個數,所以我們把這些不nice的數直接扔到一個數組里面。
然后暴力去和整個序列去交換就好了。
然后check也是只用check那些不nice的位置和你交換的那個位置的數。
代碼
#include<bits/stdc++.h> using namespace std; const int maxn = 2e5+7; int n; int a[maxn]; vector<int>tmp; long long ans = 0; set<pair<int,int> >S; bool check() {for(int i=0;i<tmp.size();i++){for(int j=-1;j<=1;j++){if(tmp[i]+j==0)continue;if(tmp[i]+j==n+1)continue;int pos = (tmp[i]+j);if(pos%2==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() {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 ) tmp.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 ) tmp.push_back( i );}}if(tmp.size()>30)return puts("0"),0;for(int i=0;i<tmp.size();i++){for(int j=1;j<=n;j++){if(tmp[i]==j)continue;swap(a[tmp[i]],a[j]);bool ok = check();if(j%2==1){if(a[j]>=a[j+1]||a[j]>=a[j-1])ok=false;}if(j%2==0){if(a[j]<=a[j+1]||a[j]<=a[j-1])ok=false;}if(ok){pair < int , int > SS = make_pair( min( tmp[i] , j ) , max( tmp[i] , j ) );if(!S.count(SS)){S.insert( SS );ans++;}}swap(a[tmp[i]],a[j]);}}cout<<ans<<endl; }轉載于:https://www.cnblogs.com/qscqesze/p/5296520.html
總結
以上是生活随笔為你收集整理的IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C. Bear and Up-Down 暴力的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到蛇和蛇蛋预示着什么
- 下一篇: DB2中ixf文件的导入导出