日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1715: 序列变换(LIS变形)

發(fā)布時間:2024/9/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1715: 序列变换(LIS变形) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1715: 序列變換
時間限制: 1 Sec 內(nèi)存限制: 128 MB

[提交][狀態(tài)][討論版]
題目描述
我們有一個數(shù)列A1,A2…An,你現(xiàn)在要求修改數(shù)量最少的元素,使得這個數(shù)列嚴格遞增。其中無論是修改前還是修改后,每個元素都必須是整數(shù)。
請輸出最少需要修改多少個元素。
輸入
第一行輸入一個N(1≤N≤10e5),表示數(shù)列的長度
第二行輸入N個數(shù)A1,A2,…,An。
每一個數(shù)列中的元素都是正整數(shù)而且不超過10e6。
輸出
輸出最少需要修改多少個元素
樣例輸入

3 2 5 4

樣例輸出

1

提示
來源
/*
最長上升子序列的變形。
每個元素都必須為整數(shù)(正,負都行)
對于:
9
2 2 3 3 4 4 5 5 6
ans = 7
---->-1 2 3 4 5 6 7 8 9
當aj > ai 時,i < j,i與j之間的元素要也要嚴格遞增,得滿足這個條件:
aj-ai >= j-i
整理上式:
aj - j >= ai - i
所以可以對原序列預(yù)處理一下,nowValue = oldValue-index
然后本題數(shù)據(jù)比較大不呢之間用O(n^2)解法,只能用基于貪心的O(nlogn)解法
*/

#include <bits/stdc++.h> using namespace std; const int maxn = 1e5+5; int a[maxn]; int st[maxn]; int main() {ios::sync_with_stdio(false);int n;cin>>n;for(int i = 0; i < n; i++){cin>>a[i];a[i] = a[i] - i;}int t = 0;st[t] = -(1<<30);for(int i = 0; i < n; i++){// a[i] - a[j] >= i-j;-->a[i]-i >= a[j]-j,i>jif(a[i] >= st[t]){st[++t] = a[i];}else{//可以直接用upper_bound,但是我更喜歡自己寫二分// int pos = upper_bound(st,st+t+1,a[i])-st;//st[pos] = a[i];int left = 1, right = t;while(left <= right){int mid = (left+right)>>1;if(a[i] >= st[mid]){left = mid + 1;}else{right = mid - 1;}}st[left] = a[i];}}cout<<n-t<<endl;return 0; }

總結(jié)

以上是生活随笔為你收集整理的1715: 序列变换(LIS变形)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。