CF1408B Arrays Sum

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1408B Arrays Sum相关的知识,希望对你有一定的参考价值。

Link

考虑到 ∑ i = 1 m b i , j = a j \\sum\\limits_{i=1}^m b_{i,j}=a_j i=1mbi,j=aj

a j = a j − 1 a_j=a_{j-1} aj=aj1,那么我们也令 b i , j = b i , j − 1 b_{i,j}=b_{i,j-1} bi,j=bi,j1,这样仍满足条件而且没有产生任何新数字

a j > a j − 1 a_j>a_{j-1} aj>aj1,那么某些 b i , j b_{i,j} bi,j就需要变大

显然我们只需要选择某个 i i i使 b i , j = b i , j − 1 + a j − a j − 1 b_{i,j}=b_{i,j-1}+a_j-a_{j-1} bi,j=bi,j1+ajaj1即可,这样只有一个 b b b序列的不同数字增加

首先构造 a 1 a_1 a1,那么 m m m b i , 1 b_{i,1} bi,1都是新加入的数字,每个 b b b序列有 1 1 1个不同数字

初次之外,每当 a j > a j − 1 a_j>a_{j-1} aj>aj1时,可以选择一个 b i , j b_{i,j} bi,j来变化,一共可以变化 ( k − 1 ) ∗ m (k-1)*m (k1)m

所以设 j ∈ [ 2 , n ] & & a j > a j − 1 j\\in[2,n]\\&\\&a_j>a_{j-1} j[2,n]&&aj>aj1的下标 j j j z z z种取值

满足 z < = ( k − 1 ) ∗ m z<=(k-1)*m z<=(k1)m

容易解的 m m m的最小值为 ⌈ z k − 1 ⌉ \\lceil \\frac{z}{k-1} \\rceil k1z

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int inf = 1e9;
const int maxn = 3e5+10;
int n,t,k,a[maxn],mx[maxn];
vector<int>vec[maxn];
signed main()
{
	cin >> t;
	while( t-- )
	{
		cin >> n >> k;
		for(int i=1;i<=n;i++)	cin >> a[i];
		int z = 0;
		for(int i=2;i<=n;i++)
			if( a[i]!=a[i-1] )	z++;
		if( k==1 )	
		{
			if( z )	cout << -1 << endl;
			else	cout << 1 << endl;	
		}
		else	cout << ( z-1 )/( k-1 )+1 << endl;
	}
}

以上是关于CF1408B Arrays Sum的主要内容,如果未能解决你的问题,请参考以下文章

CF 1312D. Count the Arrays

1 代码片段1

「题解」CF620D Professor GukiZ and Two Arrays

CF1550D Excellent Arrays(完全会了更新)

[CF 392 Div.1 D]Three Arrays

CF1312D Count the Arrays