codeforces1392F Omkar and Landslide

https://codeforces.com/problemset/problem/1392/F

这题的关键是观察出无论何时,至多只有一对是相同值的

考虑没有相同值的时候,如果某个时刻出现了a[i]+2=a[i+1]的时候,假设a[i-1]和a[i+2]都无法滑坡了,那么此时会出现a[i]=a[i+1]

但是由于滑落之前a[i+2]-a[i+1]等于0或1(a[i+2]此时无法降到a[i+1],只能a[i+1]滑落到a[i]),此时a[i+2]-a[i+1]>=1,于是就不会出现两个同时存在的相同的位置,a[i-1]也是如此。一开始是严格递增没有相邻位置相同的,出现一个相同的也最多只有一对,因为出现一对相同的必定使另外一对相同的变得不同

接下来就是水题了,算一下基准值base然后把1-n变成base,base+1...base+n-1这样,剩余没分完的说明有相同的位置,那么加到1-sum%n这些位置上就行了。

 

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;

const int maxl=1e6+10;

int n,m,cas,k,cnt,tot;
ll a[maxl],b[maxl],ans[maxl];
char s[maxl];
bool in[maxl]; 

inline void prework()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
} 

inline void mainwork()
{
	ll sum=0;
	for(int i=1;i<=n;i++)
		sum+=a[i]-i+1;
	for(int i=1;i<=n;i++)
		ans[i]=i-1+sum/n;
	int up=sum%n;
	for(int i=1;i<=up;i++)
		ans[i]++;
}

inline void print()
{
	for(int i=1;i<=n;i++)
		printf("%lld ",ans[i]);
}

int main()
{
	int t=1;
	//scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值