XDOJ 1107

来源:互联网 发布:线路设计软件 编辑:程序博客网 时间:2024/05/22 07:50

见标题滚。。。

这个题目和我之前想出的题一模一样诶。。。好激动。。

其实蛮简单,先按一维排序后求LIS就好了。。

#include<bits/stdc++.h>#define inc(i,l,r) for(int i=l;i<=r;i++)#define dec(i,l,r) for(int i=l;i>=r;i--)#define link(x) for(edge *j=h[x];j;j=j->next)#define mem(a) memset(a,0,sizeof(a))#define inf 1000000007#define ll long long#define succ(x) (1<<x)#define lowbit(x) (x&(-x))#define NM 100005using namespace std;int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f;}int n,a[NM],b[NM],c[NM],d[NM],tmp[NM],len;bool cmp(int x,int y){return (a[x]<a[y])||((a[x]==a[y])&&(b[x]>b[y]));}int main(){//freopen("data.in","r",stdin);while(~scanf("%d",&n)){mem(a);mem(b);mem(c);mem(d);mem(tmp);inc(i,1,n)a[i]=read();inc(i,1,n)b[i]=read();inc(i,1,n)tmp[i]=i;sort(tmp+1,tmp+1+n,cmp);inc(i,1,n)c[i]=a[i];inc(i,1,n)a[i]=c[tmp[i]];inc(i,1,n)c[i]=b[i];inc(i,1,n)b[i]=c[tmp[i]];d[len=1]=b[1];inc(i,2,n){if(b[i]>d[len])d[++len]=b[i];else d[lower_bound(d+1,d+len,b[i])-d]=b[i];}printf("%d\n",len);}return 0;}

1107: Too Simple

时间限制: 2 Sec  内存限制: 128 MB
提交: 138  解决: 32
[提交][状态][讨论版]

题目描述

一棵n个点的树, 树上每个点有两个权值x ,y。 x, y都是整数。
现在要从树上选出尽可能多的点重新建边组成一棵新树, (仅仅一棵新树)。
新树要满足,树上任意两个点的权值(xi, yi), (xj, yj) 都满足xi < xjyi < yj 或者 满足xi > xj
yi > yj.输出新树最多能由多少个点组成。

输入

多组数据,处理到EOF 不超过10组
第一行整数n , 2 <= n <= 100000
接下来两行 ,每行n个整数,
第一行表示n个点的X权值 x1, x2, x3....xn, 空格隔开。
第二行表示n个点的Y权值y1, y2, y3....yn,空格隔开。
0 < x, y < 100000000

输出

输出新树最多能有多少个点组成。

样例输入

51 5 3 2 48 6 9 3 4

样例输出

3

提示

来源


原创粉丝点击