您的位置:首页 > 其它

[模型转化 最长下降子序列] BZOJ 2924 [Poi1998]Flat broken lines

2016-12-17 11:25 309 查看
将坐标系向左旋转45度,那么折线就要求x,y均不降,以x为第一关键字,y为第二关键字排序,那么一条折线就对应一个不降子序列。

根据最小链覆盖=最长反链,故求出最长下降子序列的长度即可

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;

const int N=30005;

struct abcd{
int x,y;
void read(){
int ix,iy; scanf("%d%d",&ix,&iy); x=ix-iy; y=iy+ix;
}
bool operator < (const abcd &B) const{
return x==B.x?y<B.y:x<B.x;
}
bool operator == (const abcd &B) const{
return x==B.x && y==B.y;
}
};

int n;
abcd A
;
int a
;
int c
; int len;
int f
;

int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d",&n); for (int i=1;i<=n;i++) A[i].read();
sort(A+1,A+n+1);
n=unique(A+1,A+n+1)-A-1;
for (int i=1;i<=n;i++) a[i]=-A[i].y;
f[1]=1; c[++len]=a[1];
for (int i=2;i<=n;i++){
if (a[i]>c[len])
c[++len]=a[i];
else{
int iter=lower_bound(c+1,c+len+1,a[i])-c;
c[iter]=a[i];
}
}
printf("%d\n",len);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: