bzoj4547 小奇的集合】的更多相关文章

当序列中最大和次大都是负数的时候,其相加会是一个更小的负数,因此答案为(Σai)+(m1+m2)*k,如果最大是正数次大是负数,那么一直相加直到两个数都为正数,当最大和次大都是正数时,做一下矩阵乘法即可. 代码 #include<cstdio> #include<cstring> #include<algorithm> #define N 200010 #define P 10000007 using namespace std; typedef long long l…
BZOJ4547 Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) Input 第一行有两个整数n,k表示初始元素数量和操作数,第二行包含n个整数表示初始时可重集的元素. 对于100%的数据,有 n<=105,k<=109,|ai|<=10^5 Output 输出一个整数,表示和的最大值.答案对10000007取模. Sample Input…
[BZOJ4547]Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) Input 第一行有两个整数n,k表示初始元素数量和操作数,第二行包含n个整数表示初始时可重集的元素. 对于100%的数据,有 n<=10^5,k<=10^9,|ai|<=10^5 Output 输出一个整数,表示和的最大值.答案对10000007取模. Sample Inp…
4547: Hdu5171 小奇的集合 Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 175  Solved: 85[Submit][Status][Discuss] Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n,k表示初始元素数量和操作数,第二行包含n个整数表示初始时可重集的元素. 对于100…
4547: Hdu5171 小奇的集合 题目:传送门 题解: 做一波大佬们的坑...ORZ 不得不说,我觉得矩阵很简单啊,就一个3*3的(直接看代码吧) 给个递推柿纸:f[i]=f[i-1]+max1+max2 因为题目保证答案非负,那么一般情况下,肯定是将max1+max2加入原数列啊 兴高采烈的一顿乱水,nice!一WA md被CC无情嘲笑... 再看一波题目...abs(a[i])<=10^5??? 有负数?! woc那如果max2<0那么我不就GG??? 好的又是一顿乱水,直接暴力将m…
题意 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) 对于100%的数据,有 n<=10^5,k<=10^9,|ai|<=10^5 分析 参照GXZlegend的题解. 矩阵乘法 显然每次选择集合中最大的两个数相加即可. 如果最大的两个数都是正数,那么结果显然也是正数并且比它们都要大,即\((b,a)→(a,a+b)\),所以可以使用矩阵乘法来解决. 具体过程: \[ \left[ \begi…
Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n,k表示初始元素数量和操作数,第二行包含n个整数表示初始时可重集的元素. 对于100%的数据,有 n<=10^5,k<=10^9,|ai|<=10^5 Output 输出一个整数,表示和的最大值.答案对10000007取模. Sample Input 2 2 3 6 Sample Outpu…
http://www.lydsy.com/JudgeOnline/problem.php?id=4547 本蒟蒻并不会矩乘求Fibonacci数列前缀和,所以果断分块打表,常数竟然比矩乘要小! PS:今天是长者90岁大寿,+1s #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int p = 10000007; const int bef[1002] =…
Sol 首先,考虑这个要怎么搞...让总和最大的方法就是选出当前集合中最大的两个数相加放入集合中就可以了,证明非常简单,当前集合的和为x,它的和只会一直往后增加,所以只需要找到最大的两个数的和加入便是最佳答案.知道了这个以后,手动递推一下就是一个斐波拉契数列. 然后斐波拉契数列数列自然可以矩乘,但是矩阵乘法不能解决负数斐波拉契问题.而且,一正一负就不是斐波拉契数列的递推了.递推应该是这个样子. \(F_2=F_1+F_0,F_3=F_2+F_1=F_1+F_1+F_0...F_n=F_1*(n-…
题目链接 显然有贪心每次选择最大的两个数来做. 于是暴力地把最大的两个数调整到非负(暴力次数不超过1e5),接下来使用矩阵乘法即可. \[ \begin{pmatrix} B'\\S'\\T' \end{pmatrix} = \begin{pmatrix} 1&1&0\\ 1&0&0\\ 1&1&1 \end{pmatrix} \begin{pmatrix} B\\S\\T \end{pmatrix} \] #include <bits/stdc++.…