【EOJ Monthly 2018.10 - B】 莫干山奇遇 (思维构造,数学,数组,贪心)(总结)

版权声明:欢迎学习我的博客,希望ACM的发展越来越好~ https://blog.csdn.net/qq_41289920/article/details/82946421

题干:

Time limit per test: 2.0 seconds

Memory limit: 512 megabytes

出题人当然是希望出的题目有关 oxx,于是想方设法给题目配上一些有关 oxx 的背景故事,使得它看起来不那么无趣。但有的时候却无法引入合适的小姐姐,使得 oxx 显得非常可怜。所以出题人删除了故事,只留下一个枯燥乏味的数学问题。

【故事已删除】

给一个长度为 n 的序列 a1,a2,…,an ,求一个长度为 m 的序列 b1,b2,…,bm 使得:

  • a1,a2,…,an 是 b1,b2,…,bm 的子序列(不一定连续),且
  • 存在常数 p>0 使得 b1,b2,…,bm 是一个 p -莫干山序列。

序列 s1,s2,…,sn 是 p -莫干山序列,当且仅当:存在 0≤x<p 对于 1≤i≤n 满足 si=(x+i)modp 。

求 m 的最小值。

Input

第一行一个整数 n (1≤n≤2⋅105 )。

第二行 n 个整数用空格隔开 a1,a2,…,an (0≤ai≤109 )。

Output

输出最小的 m 。

Examples

Input

2
0 2

Output

3

Input

3
0 2 0

Output

4

Input

1
0

Output

1

Input

10
0 1 2 3 5 6 7 8 9 1000000000

Output

1000000001

Input

3
0 1 2

Output

3

Note

样例 1: [0, 1, 2].

样例 2: [0, 1, 2, 0].

样例 3: [0].

解题报告:

首先注意到 p 的取值应该就是 max(ai)+1 。然后相邻两项之间贪心地填东西。答案就是

下面给出证明:

   显然可以注意到,p越大,需要填的数就会越多,相应的,m就越大,所以我们需要让p越小越好,下界是多少呢?因为我们需要可以表示出所有的ai啊!!所以p肯定要大于max(ai),于是乎令p=max(ai)+1是正解。

   其次,x的取值,因为题目说存在一个x,使对于任意的i、、、说明确定了x之后,就不再改变了。(想想如果是对于任意的i,都存在一个x,如果这样叙述的话?、、、这题就简单多了貌似)一般这种存在性构造问题,都是构造的值令第一个值(a1)是最优的,为最优解。所以我们令x=(a1) -1。对于这个题也只能是让第一个值是最优的,因为可以证明,每两个数之间要插入的数字的个数都是相同的。于是p、x这两个值都被我们得到了,这个题也就自然而然解决了。

AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX = 2e5 +5;
ll a[MAX];
int main() 
{
	int n;
	ll maxx = -1;
	cin>>n;
	for(int i = 1; i<=n; i++) {
		scanf("%lld",a+i);maxx = max(maxx,a[i]);
	}
	ll p = maxx+1;
	ll ans = 0;
	for(int i = 2; i<=n; i++) {
		ans += (a[i]-a[i-1] - 1 + p)%p;
	}
	printf("%lld\n",ans + n);
	return 0;
}

总结:

   对于这种存在某变量的构造问题,往往可以先讲一些不确定量找到对应的确定量(比如这题要先把p确定了),然后再确定这个存在性的变量(往往和数组中的第一个元素或者某一个元素是对应的)。

猜你喜欢

转载自blog.csdn.net/qq_41289920/article/details/82946421