思考
最大長シーケンス増加
サブシーケンスにおいて発現DP [I]は、i番目の要素の最後まで上昇しない
転送方程式DP [I] = MAX(DP [I]、DP [J] + 1:(H [jの場合]> [I、I-1 H ])j∈1〜
最適化アイデア:DPの値が同じで、比較的多数(ここではYを指す)可能な限り前方に、明らかに優れているのように多数
のすべての鉛Dアレイは単調二部を減少させるために使用することができます
例としては、次の図は、最適化されたLIS-半分の導入を補完:転載ニンニク乗客数を
コード
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n;
struct node{
int x,y;
int pos;
}a[maxn];
int len = 0;
int d[maxn];
int b[maxn];
bool cmp(node u,node v){
if(u.x == v.x) return u.y < v.y;
return u.x < v.x;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
a[i].pos = i;
}
sort(a+1,a+n+1,cmp);
d[++len] = a[1].y;
b[a[1].pos] = 1;
for(int i=2;i<=n;i++){
if(a[i].y < d[len]) d[++len] = a[i].y,b[a[i].pos] = len;
else{
//找第一个小于的
int pos = upper_bound(d+1,d+len+1,a[i].y,greater<int>()) - d;
d[pos] = a[i].y;
b[a[i].pos] = pos;
}
}
cout<<len<<endl;
for(int i=1;i<=n;i++) cout<<b[i]<<" ";
return 0;
}