列表

详情


NC26253. 小石的妹子

描述

小石有 n 个妹子,每个妹子都有一个细心程度  和一个热心程度
小石想给她们一个重要程度 (重要程度为 1 表示最重要,重要程度越小表示越重要)。
如果一个妹子 i 的细心程度和热心程度都比妹子 j 大,那么妹子 i 的重要程度要大于妹子 j 的重要程度,即妹子 i 比妹子 j 重要。
流程如下:
每次从所有没有重要程度的妹子中,找到若干妹子。对于这些妹子的任意一个,需要保证没有其他妹子比她更重要。然后把她们的重要程度标为 1 。下一次再从剩下没有重要程度的妹子中找到若干妹子,依然符合上述条件,然后把她们的重要程度标为 2,……,重复直到所有妹子都有自己的重要程度。
由于妹子太多,小石忙不过来,请你帮帮他。

输入描述

第一行输入一个正整数 n,表示妹子的数量。
接下来 n 行,每行两个正整数 a_i,b_i,描述每个妹子的细心程度和热心程度。 
保证所有的 a_i 两两不等,所有的 b_i 两两不等。 

输出描述

共 n 行,第 i 行输出一个正整数 t_i 表示第 i 个妹子的重要程度。

示例1

输入:

5
1 4
2 2
3 3
4 1
5 5

输出:

2
3
2
2
1

说明:

第一轮取第 5 个妹子(5 5),因为没有其他妹子比她重要,标记为 1;

第二轮取编号为 1,3,4 的妹子,因为对于其中的任意一个妹子,都没有其他妹子比她们重要,标记为 2;

第三轮把编号为 2 的妹子标记为 3 。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 278ms, 内存消耗: 3196K, 提交时间: 2019-07-13 21:46:18

#include<bits/stdc++.h>
using namespace std;
struct A{
int a,b,i,m;
}a[100020];
int g[100020],d[100020],n,i,x;
bool cmp(A a,A b){return a.b>b.b;}
int main(){
    cin>>n;
    for(i;i<n;++i)cin>>a[i].a>>a[i].b,a[i].a=-a[i].a,a[i].i=i;
    sort(a,a+n,cmp);memset(g,0x3f3f3f3f,sizeof(g));
    for(i=0;i<n;++i)g[x=lower_bound(g,g+n,a[i].a)-g]=a[i].a,d[a[i].i]=x+1;
    for(i=0;i<n;i++)cout<<d[i]<<endl;
}

C++11(clang++ 3.9) 解法, 执行用时: 414ms, 内存消耗: 5084K, 提交时间: 2019-07-16 15:19:33

#include<bits/stdc++.h>
using namespace std;
const int N=100020;
int g[N],d[N],n,i,x;
struct A
{
	int a,b,i,m;
	bool operator<(A B)
	{return b>B.b;}
}a[N];
int main()
{
	cin>>n;
	for(i=0;i<n;++i)
		cin>>a[i].a>>a[i].b,a[i].a=-a[i].a,a[i].i=i;
	sort(a,a+n);
	memset(g,0x3f,sizeof g);
	for(i=0;i<n;++i)
		g[x=lower_bound(g,g+n,a[i].a)-g]=a[i].a,d[a[i].i]=x+1;
	for(i=0;i<n;i++)
		cout<<d[i]<<endl;
}

上一题