P1233 木棍加工(LIS)
思路:挺好的題,因爲有兩個屬性,考慮將一個屬性遞減排序,然後對令一個屬性求就是答案了。
時間複雜度:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e3+5;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
inline void read(int &x){
x=0;int w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
for(;ch>='0'&&ch<='9';ch=getchar())
x=(x<<3)+(x<<1)+(ch&15);
x*=w;
}
PII a[N];
int n,d[N],cnt=1;
bool cmp(PII a,PII b){
return a.fi>b.fi;
}
int main(){
read(n);
for(reg int i=1;i<=n;i++) read(a[i].fi),read(a[i].se);
sort(a+1,a+n+1,cmp);
d[1]=a[1].se;
for(reg int i=2;i<=n;i++){
if(d[cnt]<a[i].se) d[++cnt]=a[i].se;
else {//這裏用lower_bound而非upper_bound 因爲要從每個非遞增子序列中選出一個組成LIS,如果相等,就會被歸入另一個非遞增序列中。
int p=lower_bound(d+1,d+cnt+1,a[i].se)-d;
d[p]=a[i].se;
}
}
printf("%d\n",cnt);
return 0;
}