【洛谷P9472】[yLOI2022] 枕万梦

作者:乐天JOE
题目链接



题目大意

给定 n n n 个数列的第 1 1 1 项,数列长度为 m + 1 m+1 m+1

i i i 个数列的第 j j j 项需要满足 a i , j = a i , j − 1 × i a_{i,j}=a_{i,j-1} \times i ai,j=ai,j1×i

把数列按照字典序排序,输出排序后的序列编号。


思路

前置芝士:字典序排序

这题的你需要知道数列的字典序排序。

排序首先看第一位,如果相同,看第二位,再相同,看第三位,以此类推即可。

从小到大。


分析

我们首先来看这个数列,字典序会先排数列中的第一个数字,如果不一样,只需要把小的放前即可。

那么对于第一个数字一样的情况,我们先来看一下数列需要满足的递推式 a i , j = a i , j − 1 × i a_{i,j}=a_{i,j-1} \times i ai,j=ai,j1×i ,我们发现从第二位开始,由于两个数列的 i i i 不同,所以第二个数肯定不同,那么谁大谁小呢?

当然是 i i i 比较小的哪一方比较小的啊!!!

那就很简单了,我们只需要再对于编号再排序即可。

然后你就会发现你是 70 70 70 分,为什么呢?我们看向数据范围,后面三个点的数据有一处为 1 ≤ ∣ a i , 0 ∣ ≤ 1 0 9 1 \leq \left| a_{i,0} \right| \leq 10^9 1ai,0109

说明什么。有可能会有负数,那么如果是负数,如果一样的数,反而要输出 i i i 比较大的哪一方。


实现

实现就十分简单了,只需要用结构体,里面定义编号和序列的第一位数字。

然后再用 cmp 把需要判断的东西写在里面就行了。

对了,保险一点,记得开 long long


CODE

Talk is cheap.Show me the code —— AprendiZ

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
	int num,id;
}a[100005];
int n,m;
bool cmp(node x,node y)
{
	if(x.num!=y.num)
		return x.num<y.num;
	if(x.num<0)
		return x.id>y.id;
	return x.id<y.id;
}
main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		cin>>a[i].num,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;
}

本人是个蒟蒻,学艺不精,如有错误或建议,请在评论区指出。

感谢观看,既然你都看到这里了,不妨点个赞或者关注?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值