Codeforces Round #604 (Div. 2) B - Beautiful Numbers(规律)

在这里插入图片描述
在这里插入图片描述题意:美丽数的定义如下,对于一个数i,如果能找到一个区间【l,r】满足区间内的数的范围是[1,i](顺序无所谓)(也就是将区间排序后是序列为[1,i]),满足该条件的数为美丽数,给定初始序列,问哪些数是美丽数。
思路:其实这个题如果不是放在B题的话我感觉我会往很复杂的方向去想,其实这个也是有规律的,对于一个数i如果是美丽数的话,那也【1,i-1】这些数的下标与i的下标构成的一定是个公差为1的等差数列,为了方便可以先排序,如果下标和满足等差数列和的就是美丽数。不过其实我这个做法有点麻烦了,而且一开始乘的时候还爆long long了,大佬们还有其他更简便的做法,不过我看了其实核心原理都差不多。

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+1;
typedef long long ll;
int T,n,sum,ans[maxn],minn;
struct node{
	ll val;
	int id;
}s[maxn];
bool cmp(const node &a,const node &b)
{
	return a.val<b.val;
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;++i) scanf("%lld",&s[i].val),s[i].id=i;
		sort(s+1,s+1+n,cmp);
		ll sum=0;
		minn=maxn+100;
		for(int i=1;i<=n;++i)
		{
			sum+=s[i].id;
			minn=min(minn,s[i].id);
			ll t1=1ll*i*minn;
			ll t2=1ll*i*(i-1)/2;
			ll t=(t1+t2);
			ans[i]=(sum==t);
		}
		for(int i=1;i<=n;++i) printf("%d%s",ans[i],(i==n)?"\n":"");
	}
}
发布了39 篇原创文章 · 获赞 0 · 访问量 1060

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104102661