题意:
给定长度为n的序列a,
现在要求你对每一个位置涂色,
要求对于任意相同颜色的两个位置i和j,(i<j),必须满足a(i)<a(j)。
问最少需要多少种颜色
数据范围:n<=2e5,0<=a(i)<=1e9
解法:
显然颜色相同的位置构成一个LIS,
问题变为序列最少可以被分成多少个互不相交的LIS,或者说用最少的
开一个mulset,记录当前每个LIS链的结尾,
每当遇到一个新的数x,找到<x的最大的LIS结尾,显然这样最优,
如果找不到可插入的LIS链,则新建一个LIS,结尾为这个x。
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e5+5;
int a[maxm];
int b[maxm];
int n;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
multiset<int>s;
s.insert(a[1]);
for(int i=2;i<=n;i++){
auto it=s.lower_bound(a[i]);//>=a[i]
if(it==s.begin()){//最小的都>=a[i],新建一个LIS链
s.insert(a[i]);
}else{
it--;
s.erase(it);
s.insert(a[i]);
}
}
cout<<s.size()<<endl;
return 0;
}