算進 雙端佇列 題解

2022-05-06 21:06:12 字數 1471 閱讀 8685

acwing 題目位址

好題,**短,思維性強,細節多。

我們應該推導出以下兩條性質:

考慮乙個雙端佇列,用函式 \(y=id(x_i)\) 來形象的表示這個數列的特徵(當然這個函式是離散的,為了形象,將他連續),函式的影象如下:

它是乙個單谷函式!

我們把原序列排好序,它們的下標排成乙個函式(相同的數字下標直接按從小到大排,先不做處理),函式的影象應該是這樣子的:

波浪形的。又因為雙端佇列中的元素必須是原序列中連續的一段,所以我們就把問題轉化為在上面這個函式裡面找谷底,乙個谷底就是乙個雙端佇列(懂?)

誒誒誒,別走啊,這個題目還沒做完呢,我們還不能保證這樣是最優的(也就是波谷是最少的),我們要用一些貪心策略來使得波谷最少。

這就要請出連在一起(值相同)的這些數了。我們知道,連在一起(值相同)的這些數內部都是這個樣子的:

我們要用一些操作把這個函式盡量捋平,又因為我們發現值相同的這些數內部不是單調增就是單調減的(因為這樣才會優),大力分類討論,看一下哪一種會使得這個函式更加平整(上公升趨勢就盡量往上公升,下降趨勢就盡量往下降)。

最後注意乙個細節,我們不是數有多少個波谷,而是數有多少個波峰,因為:

(自己多寫寫,多畫畫,結合這篇題解和**思考思考,我覺得還是可以搞懂這題的)

talk is cheap.show me the code.

#include#define inf 1e18

#define int long long

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x * f;

}const int n = 200007;

int n,ans;

struct node

}a[n];

signed main()

sort(a+1, a+1+n);

int last = inf, dir = -1; ans = 1;

for(int i=1,j;i<=n;i=j+1) else

} printf("%lld\n",ans);

return 0;

}

這是一道思維題,但是還是可以學到套路的,學到了:

BZOJ 2457雙端佇列題解

我們之前學習了如何使用stl中的佇列 現在我們來看一道與佇列有關的神奇的題 看似佇列而非為佇列 雙端佇列 分析 如果現在有一段序列 ai,ai 1,ai 2,aj 1,aj 滿足該雙端佇列的要求,即滿足 aj 1 ai 1 如下 include include include include inc...

BZOJ2457 雙端佇列 題解

本題直接求解十分困難,因為在不知道整個序列的數字規律時當前所作決策都無法保證最優性。考慮正難則反,題目轉化為將乙個非降序列分成盡量少的幾段,讓每段對應原問題的雙端佇列。先將原陣列排序,由於原陣列下標對應了插入的順序,那麼根據雙端佇列的性質,被劃分出的每一段的下標都應該滿足單谷性質 最先插入的在最中間...

佇列 雙端佇列

1.佇列 佇列是遵循先進先出 fifo,也稱為先來先服務 原則的一組有序的項。佇列在尾部新增新 元素,並從頂部移除元素。最新新增的元素必須排在佇列的末尾 class queue 向佇列新增元素 enqueue element 檢查佇列是否為空並獲取它的長度 isempty 從佇列移除元素 deque...