XDOJ 1107

见标题滚。。。

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

其实蛮简单,先按一维排序后求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 < 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

输出

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

样例输入

5
1 5 3 2 4
8 6 9 3 4

样例输出

3

提示

来源


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值