1. 程式人生 > 實用技巧 >算競上的一道題(找規律)

算競上的一道題(找規律)

今天看到這個題很有意思就做了一下

題目是acwing 134 題 傳送門

這是很特殊的一道題,能想到正解確實挺難,觀察雙端佇列插入有個性質小數在前大數在後,所以排序後的陣列下標如果是波谷的話就可以直接放到一個佇列裡面,具體情況模擬一下就知道了,這樣我們就把這個問題轉化為求最少波谷的問題,那麼如何求最少波谷這個問題呢?就可以把相同的一段數字儘可能讓它單調就行了,也就是存在兩種情況,單調上升和單調下降,(通過畫圖可以看出)如果不能讓它保持單調的話就轉向就可以了。具體見程式碼:

#include <iostream>
#include <algorithm>
using namespace
std; const int N =2e5+10; pair<int,int> a[N]; int main(){ int n; cin>>n; for(int i=0;i<n;i++){cin>>a[i].first;a[i].second=i;} sort(a,a+n); int last=0x3f3f3f3f; int dir=-1; int res=0; for(int i=0;i<n;){ int j=i; while(j<n&&a[j].first==a[i].first){ j
++; } int minidx=a[i].second; int maxidx=a[j-1].second; if(dir==-1){ if(last>=maxidx){ last=minidx; } else { dir=1; last=maxidx; } } else { if
(last<=minidx){ last=maxidx; } else{ dir=-1; res++; last=minidx; } } i=j; } res++; cout<<res<<endl; }