sgu 199 Beautiful People (DP-LIS O(nlogn)算法 输出所选元素)

解决一个俱乐部如何邀请最多成员参加派对的问题,确保被邀请者间不会因相互间的属性比较而产生嫉妒情绪,通过寻找最长上升子序列实现。
199. Beautiful People
time limit per test: 0.25 sec.
memory limit per test: 65536 KB
input: standard
output: standard



The most prestigious sports club in one city has exactly N members. Each of its members is strong and beautiful. More precisely, i-th member of this club (members being numbered by the time they entered the club) has strength S i and beauty B i . Since this is a very prestigious club, its members are very rich and therefore extraordinary people, so they often extremely hate each other. Strictly speaking, i-th member of the club Mr X hates j-th member of the club Mr Y if S i ≤ S j and B i ≥ B j or if S i ≥ S j and B i ≤ B j (if both properties of Mr X are greater then corresponding properties of Mr Y, he doesn't even notice him, on the other hand, if both of his properties are less, he respects Mr Y very much). 

To celebrate a new 2003 year, the administration of the club is planning to organize a party. However they are afraid that if two people who hate each other would simultaneouly attend the party, after a drink or two they would start a fight. So no two people who hate each other should be invited. On the other hand, to keep the club presti≥ at the apropriate level, administration wants to invite as many people as possible. 

Being the only one among administration who is not afraid of touching a computer, you are to write a program which would find out whom to invite to the party. 

Input

The first line of the input file contains integer N — the number of members of the club. ( 2 ≤ N ≤ 100,000 ). Next N lines contain two numbers each — S i and B i respectively ( 1 ≤ S i, B i ≤ 10 9 ). 

Output

On the first line of the output file print the maximum number of the people that can be invited to the party. On the second line output N integers — numbers of members to be invited in arbitrary order. If several solutions exist, output any one. 

Sample test(s)

Input
 
4 1 1 1 2 2 1 2 2 
Output
 


1 4 



大致题意:

从俱乐部中选一些人参加派对。每个人都有两个属性。S和B。一些属性高低难以分辨的人之间容易互相嫉妒,不适合一起参加派对。而派对想要邀请俱乐部中尽可能多的人,而每两人之间都需要满足s1<s2 和 b1<b2 才不会互相嫉妒。
问最多能邀请到多少不会互相嫉妒的人,并且输出这些人的编号。


分析:

相当于选中的这些人的两个属性排起来都构成最长上升序列。

那么我们可以先按一个属性从小到大排序好,然后按另一个属性去找其最长上升序列。

因为数据比较大,用LIS的O(n^2)算法一定会超时,所以采用O(nlogn)算法来找LIS,并记录每个元素的前一个,方便输出。


LIS的O(nlogn)算法可以参考

http://www.slyar.com/blog/longest-ordered-subsequence.html~~~





#include 
    
     
#include 
     
      
#include 
      
       
using namespace std;

int fa[100010],stk[100010],ret;

struct node{
	int a,b,id;
}men[100010];//记录每个人的s(a)和b信息,并且记录下是第几个人。

bool cmp(node x,node y)//排序先按a升序,若相同 再按b排序。
{
	if(x.a==y.a)
	{
		return x.b>y.b;
	}
	else
		return x.a
       
        men[stk[ret]].b)//比前一个元素大的数就将其选进序列
			{
				stk[++ret]=i;
				fa[i]=stk[ret-1];//为记录lis中这个元素的前一个是哪个,为了最后输出选择了哪些人。
			}
			else//二分检索现选择的最长上升子列中比这个元素大的第一个数,并将其替换。
			{
				int begin,end;
				begin=1;
				end=ret;
				while(begin<=end)
				{
					int mid=(begin+end)/2;
					if(men[i].b>men[stk[mid]].b)
					{
						begin=mid+1;
					}
					else
						end=mid-1;
				}
				stk[begin]=i;//替换,并记录其前一个人。
				fa[i]=stk[begin-1];
			}
		}
		printf("%d\n",ret);
		print(stk[ret]);//递归输出选中参加party的人。
	}
	return 0;
}

       
      
     
    


本研究基于扩展卡尔曼滤波(EKF)方法,构建了一套用于航天器姿态与轨道协同控制的仿真系统。该系统采用参数化编程设计,具备清晰的逻辑结构和详细的代码注释,便于用户根据具体需求调整参数。所提供的案例数据可直接在MATLAB环境中运行,无需额外预处理步骤,适用于计算机科学、电子信息工程及数学等相关专业学生的课程设计、综合实践或毕业课题。 在航天工程实践中,精确的姿态与轨道控制是保障深空探测、卫星组网及空间设施建设等任务成功实施的基础。扩展卡尔曼滤波作为一种适用于非线性动态系统的状态估计算法,能够有效处理系统模型中的不确定性与测量噪声,因此在航天器耦合控制领域具有重要应用价值。本研究实现的系统通过模块化设计,支持用户针对不同航天器平台或任务场景进行灵活配置,例如卫星轨道维持、飞行器交会对接或地外天体定点着陆等控制问题。 为提升系统的易用性与教学适用性,代码中关键算法步骤均附有说明性注释,有助于用户理解滤波器的初始化、状态预测、观测更新等核心流程。同时,系统兼容多个MATLAB版本(包括2014a、2019b及2024b),可适应不同的软件环境。通过实际操作该仿真系统,学生不仅能够深化对航天动力学与控制理论的认识,还可培养工程编程能力与实际问题分析技能,为后续从事相关技术研究或工程开发奠定基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值