P9472 [yLOI2022] 枕万梦

发布时间 2023-08-22 22:01:22作者: Thenyu

原题

因为数列字典序是从第一项开始看的,样例输入了每个数列的第一项,所以如果数列的第一项就不相同,那么第一项小的字典序一定是小的。

接着如果两个数列的第一项相同,由题得第二项是第一项与这个数列的编号的乘积。如果这两个数列的第一项为正数,因为编号一定是正数,所以编号小的乘积一定小,那么字典序就小了;如果这两个数列的第一项为负数,那编号大的乘积就小,因此字典序就小。

所以这道题直接用一个结构体数组存下每个数列的第一项以及编号接着排序然后输出编号即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n,m;
struct node
{
	int x,id;
}a[N+5];
bool cmp(node x,node y)
{
	if(x.x!=y.x)return x.x<y.x;//第一项不同那么小的那个数列字典序小 
	else
	{
		if(x.x>0)return x.id<y.id;//第一项为正数,编号越小字典序越小 
		else return x.id>y.id;//第一项为负数,编号越大字典序越小 
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i].x),a[i].id=i;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;++i)
		printf("%d ",a[i].id);
	return 0;
}