1. 程式人生 > >洛谷3902 遞增 最長上升子序列+二分優化

洛谷3902 遞增 最長上升子序列+二分優化

題目

現有數列A1,A2,…An ,修改最少的數字,使得數列嚴格單調遞增。

題解

相當於找出最長上升子序列,然後要修改的數字數即數列長度減最長上升子序列長度

但是這個最長上升子序列需要優化

有一個經典的二分優化最長上升子序列的方法
設f存放一個上升序列,每次對於數列中的一個數Ai,將它與序列最後面的一個數比較,若大於最後一個數那麼上身序列長度+1,否則二分在上升序列中找一個剛好比它大的數,用Ai代替這個數,這樣做不會對原有結果產生影響,因為原有結果已經固定了,且不會破壞上升序列,可以使上升序列更優,因為在不破壞嚴格單調遞增同時讓序列中的數儘可能小,就可以在序列後放更多的數了

程式碼

#include <cstdio>

using namespace std;

int n,ans=1;
int a[100005],f[100005];

int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    f[1]=a[1];
    for (int i=2;i<=n;i++){
        if (a[i]>f[ans])
            f[++ans]=a[i];
        else{
            int
l=1,r=ans,k=0; while (l<=r){ int mid=(l+r)/2; if (f[mid]<a[i]) k=mid,l=mid+1; else r=mid-1; } f[k+1]=a[i]; } } printf("%d",n-ans); }

相關推薦

3902 遞增 上升序列+二分優化

題目 現有數列A1,A2,…An ,修改最少的數字,使得數列嚴格單調遞增。 題解 相當於找出最長上升子序列,然後要修改的數字數即數列長度減最長上升子序列長度 但是這個最長上升子序列需要優化 有一個經典的二分優化最長上升子序列的方法 設f存放一個上升序

ZZULI - 程式設計師的揹包(上升序列+二分優化)

題目連結:http://acm.zzuli.edu.cn/problem.php?id=2485 時間限制: 1 Sec  記憶體限制: 256 MB 題目描述 眾所周知,每個程式設計師都有一個揹包,裡邊裝著膝上型電腦(才不是為了隨時改bug呢),

上升序列 二分優化寫法

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 1005 int a[maxn];

HDU-1950 Bridging signals【上升序列+二分+STL】

題目傳送門 題目:一個晶片左右各有n個結點,p[i]表示左邊第i個點與右邊第p[i]個點相連。求能取到的互不交叉的點的個數。 題解:本質就是求最長上升子序列,二分做法。對於一個上升子序列,顯然其結尾元素越小,越有利於在後面接其他的元素,也就越可能變得更長。 最長上升子序列詳解 A

P1567 統計天數【上升序列/暴力】

cout show class its 輸入輸出 view adg 統計 int 題目背景 統計天數 題目描述 炎熱的夏日,KC非常的不爽。他寧可忍受北極的寒冷,也不願忍受廈門的夏天。最近,他開始研究天氣的變化。他希望用研究的結果預測未來的天氣。 經歷千辛萬苦,他收

P1020 導彈攔截 【上升序列】 || 【線段樹】

PE AD 捕捉 描述 esp 數據 依次 size new 題目鏈接:https://www.luogu.org/problemnew/show/P1020 題目描述 某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能

【P1020】關於上升序列的四種解法

這是第一次寫部落格,參加學校的acm已經有一年的時間了,現在才開始寫,說實話有點晚,但再不寫就更晚了,現在在做最長子序列方面的題,找了一道比較經典的題來舉例。 題目連結:https://www.luogu.org/problemnew/show/P1020

shuoj1936-D序列上升序列

div 數據 出錯 spa ont 復雜 cap ear 輸出 Description 已知兩個長度為N的數組A和B。下標從0標號至N-1。 如今定義一種D序列 (如果長度為L)。這樣的序列滿足下列條件: 1. 0 <= D[i] <= N-1 2. A[

POJ 1836 Alignment(DP max(上升序列 + 下降序列))

mission weight ring limit problem stream [0 sin ++ Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14486

上升序列LIS(雲筆記圖片版)

ima 筆記 img 最長上升子序列 lis 技術 logs ges mage 最長上升子序列LIS(雲筆記圖片版)

上升序列——蒜頭君的娃娃

計算 算法 ... 最大的 1.5 cst ng- one fix 蒜頭君十分喜愛它的娃娃,經常會把它們擺成一列。蒜頭君從左到右依次給他們編號為 11 到 NN,每個娃娃都有自己的萌值 T_iT?i??。現在蒜頭君想從已經擺好的隊列中,去除幾個娃娃,使得剩余的隊列滿足以下

上升序列 CSU - 1047 ( LIS LCS )

增長 csu pre style 數據 memset amp family 名詞解釋 名詞解釋: 一串數字比如1、5、3、6、9、8、10,它的子序列是從左到右不連續的若幹個數,比如1、5、6,3、9、8、10都是它的子序列。 最長上升子序列即從左到右嚴格增長的最長的一個子

O(N^2)上升序列

turn ++ blog names i++ 最長上升子序列 連續 ios pan //最長上升子序列o(N^2)可以不連續的子序列, //狀態為maxlen[i]表示以a[i]為終點最大上升子序列長度 #include<iostream> #includ

最少攔截系統-貪心或上升序列

這樣的 cor wrap action pad mem format 貪心算法 string 最少攔截系統 Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I

O(n log n)求上升序列不下降序列

clas 每一個 for spa pen pan close color style 考慮dp(i)表示新上升子序列第i位數值的最小值.由於dp數組是單調的,所以對於每一個數,我們可以二分出它在dp數組中的位置,然後更新就可以了,最終的答案就是dp數組中第一個出現正無窮的位

汕頭市隊賽 SRM14 T2 上升序列

一個數 for 子序列 ont 位置 長度 最長 連線 include 最長上升子序列 (tree.pas/c/cpp) 128MB 1s 有一個長度為n的序列a[i],其中1到n的整數各自在a[i]中出現恰好一次。 現在已知另一個等長的序列f[i],表示a[i]中以第i個

用樹狀數組寫的上升序列(友好城市),nlogn。

log stream blog sum spa 最長上升子序列 () += def #include<iostream> #include<algorithm> #define maxn 100000 #define lb(x) x&-x

HDU1257 最少攔截系統 —— 貪心 or LIS(上升序列

ret pre key ear out hide 裏來 程序 http 題目鏈接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1257 最少攔截系統 Time Limit: 2000/1000 MS (Java/Oth

LIS&LCS上升序列公共序列

最大 for 位置 升序 最終 二分 mage -1 end 何為子序列? 子序列是 從原序列取任意多項 不改變它們的順序 得到序列 最長上升子序列是: 取出的子序列元素大小從小到大 一個O(N^2)的算法 狀態 d[ i ] 表示 以第i個元素為結尾 得到的上升子

BZOJ3173: [Tjoi2013]上升序列

pac struct class -i 記得 cst 子序列 hide cnblogs 1~n<=1e5依次插入序列中某一個位置,求每次插入後的最長上升子序列。 因為新插入的數對前面插入的答案沒影響,所以只要能想方設法構造出最終序列即可。 方法一:平衡樹!。。。。 方