见标题滚。。。
这个题目和我之前想出的题一模一样诶。。。好激动。。
其实蛮简单,先按一维排序后求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 100005
using 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 < xj且yi < 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
输出
输出新树最多能有多少个点组成。
样例输入
5
1 5 3 2 4
8 6 9 3 4
样例输出
3