首页 > 代码库 > NOIp模拟1 Incr(LIS的nlogn算法)

NOIp模拟1 Incr(LIS的nlogn算法)

【分析】

这题就是拿总长度减去LIS啦,很明显。

问题是数据范围,这里用n^2就会超时,所以我们选用LIS的nlogn算法,如下。

 

【代码】

 1 #include <bits/stdc++.h>
 2 #define inf 0x7fffffff
 3 using namespace std;
 4 
 5 int n, a[100005], k, f[100005], ans;
 6 int g[100005];//记录当前的最优子序列
 7 
 8 int main() {
 9     cin >> n;
10     for (int i=1;i<=n;++i) {
11         cin >> a[i];
12         g[i]=inf;
13     }
14     for (int i=1;i<=n;++i) {
15         k=lower_bound(g+1, g+n+1, a[i])-g;//找到a[i]可插入的位置
16         g[k]=a[i];
17         f[i]=k;
18     }
19     for (int i=1;i<=n;++i)
20         ans=max(ans, f[i]);
21     cout << n-ans << endl;
22 }

 

NOIp模拟1 Incr(LIS的nlogn算法)