CF1408B Arrays Sum
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1408B Arrays Sum相关的知识,希望对你有一定的参考价值。
考虑到 ∑ i = 1 m b i , j = a j \\sum\\limits_{i=1}^m b_{i,j}=a_j i=1∑mbi,j=aj
若 a j = a j − 1 a_j=a_{j-1} aj=aj−1,那么我们也令 b i , j = b i , j − 1 b_{i,j}=b_{i,j-1} bi,j=bi,j−1,这样仍满足条件而且没有产生任何新数字
若 a j > a j − 1 a_j>a_{j-1} aj>aj−1,那么某些 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,j−1+aj−aj−1即可,这样只有一个 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>aj−1时,可以选择一个 b i , j b_{i,j} bi,j来变化,一共可以变化 ( k − 1 ) ∗ m (k-1)*m (k−1)∗m次
所以设 j ∈ [ 2 , n ] & & a j > a j − 1 j\\in[2,n]\\&\\&a_j>a_{j-1} j∈[2,n]&&aj>aj−1的下标 j j j有 z z z种取值
满足 z < = ( k − 1 ) ∗ m z<=(k-1)*m z<=(k−1)∗m
容易解的 m m m的最小值为 ⌈ z k − 1 ⌉ \\lceil \\frac{z}{k-1} \\rceil ⌈k−1z⌉
#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的主要内容,如果未能解决你的问题,请参考以下文章
「题解」CF620D Professor GukiZ and Two Arrays