[HDU517] 小奇的集合
显然有贪心每次选择最大的两个数来做。
于是暴力地把最大的两个数调整到非负(暴力次数不超过1e5),接下来使用矩阵乘法即可。
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++.h>
using namespace std;
const int mod=1e7+7;
struct Node {
int a[3][3];
int *operator[](const int&d) {return a[d];}
const int *operator[](const int&d) const{return a[d];}
Node operator*(const Node&b) const{
Node c;
memset(&c,0,sizeof c);
for(int i=0; i<3; ++i)
for(int k=0; k<3; ++k) if(a[i][k])
for(int j=0; j<3; ++j)
c[i][j]=(c[i][j]+1LL*a[i][k]*b[k][j]%mod)%mod;
return c;
}
Node pow(int y) {
Node c,x=*this;
for(int i=0; i<3; ++i)
for(int j=0; j<3; ++j) c[i][j]=(i==j);
for(; y; y>>=1,x=x*x) if(y&1) c=c*x;
return c;
}
} G,M;
int n,k,sum,a[200010];
int main() {
scanf("%d%d",&n,&k);
for(int i=1; i<=n; ++i) {
scanf("%d",a+i);
sum=(sum+a[i]+mod)%mod;
}
sort(a+1,a+n+1);
while(a[n-1]<0&&k>0) {
a[n+1]=(a[n]+a[n-1]); n++; k--;
sum=(sum+a[n]+mod)%mod;
swap(a[n],a[n-1]);
}
if(k==0) {
printf("%d\n",sum);
return 0;
}
M[0][0]=a[n];
M[1][0]=a[n-1];
M[2][0]=sum;
G[0][0]=G[0][1]=1;
G[1][0]=1;
G[2][0]=G[2][1]=G[2][2]=1;
Node ans=G.pow(k)*M;
printf("%d\n",ans[2][0]);
return 0;
}
[HDU517] 小奇的集合的更多相关文章
- 【BZOJ-4547】小奇的集合 矩阵乘法 + 递推
4547: Hdu5171 小奇的集合 Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 175 Solved: 85[Submit][Status][D ...
- BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】
BZOJ4547 Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个 ...
- 【BZOJ4547】Hdu5171 小奇的集合 矩阵乘法
[BZOJ4547]Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这 ...
- bzoj4547: Hdu5171 小奇的集合(矩阵乘法)
4547: Hdu5171 小奇的集合 题目:传送门 题解: 做一波大佬们的坑...ORZ 不得不说,我觉得矩阵很简单啊,就一个3*3的(直接看代码吧) 给个递推柿纸:f[i]=f[i-1]+max1 ...
- BZOJ4547 Hdu5171 小奇的集合
题意 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) 对于100%的数据,有 n<=10^5,k& ...
- bzoj 4547 小奇的集合
Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n ...
- 【BZOJ 4547】【HDU 5157】小奇的集合
http://www.lydsy.com/JudgeOnline/problem.php?id=4547 本蒟蒻并不会矩乘求Fibonacci数列前缀和,所以果断分块打表,常数竟然比矩乘要小! PS: ...
- BZOJ 4547: Hdu5171 小奇的集合
Sol 首先,考虑这个要怎么搞...让总和最大的方法就是选出当前集合中最大的两个数相加放入集合中就可以了,证明非常简单,当前集合的和为x,它的和只会一直往后增加,所以只需要找到最大的两个数的和加入便是 ...
- bzoj4547 小奇的集合
当序列中最大和次大都是负数的时候,其相加会是一个更小的负数,因此答案为(Σai)+(m1+m2)*k,如果最大是正数次大是负数,那么一直相加直到两个数都为正数,当最大和次大都是正数时,做一下矩阵乘法即 ...
随机推荐
- B. Interesting Array(线段树)
B. Interesting Array time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 十一、spring插件
1.STS插件_ springsource-tool-suite插件各个历史版本 2.eclipse安装spring的插件 3.奇技淫巧:在spring官网上下载历史版本的spring插件,sprin ...
- php 调用python接口出现的一系列问题(原)
调用示例代码(python写的一个谷歌翻译接口): $name = '中国'; exec("/mob360/EditImage/venv/bin/python /EditImage/fany ...
- [BZOJ4827][Hnoi2017]礼物(FFT)
4827: [Hnoi2017]礼物 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1315 Solved: 915[Submit][Status] ...
- Unity常用API备忘录
UnityEditor 复制文本到剪切板 GUIUtility.systemCopyBuffer 获取资源路径 AssetDatabase.GetAssetPath 选择节点 Selection.a ...
- Linux :vim 模式下的常用命令
[参考文章]:vim 复制一整行 复制多行 1. 查找命令 ?text 查找text,按n健查找下一个,按N健查找前一个 /text 反向查找text,按n健查找下一个,按N健查找前一个 ...
- layui按回车键实现表单提交
layui中标准用法如下: <form class="layui-form"> <input type="button" id="q ...
- tp5 多条件查询
$where['rc_category_id'] = array('eq',$cid); $where['rc_territory_ids'] = ['like', '%'.$tid.'%']; $l ...
- 用Java实现一个二叉树
介绍 使用Java实现一个int值类型的排序二叉树 二叉树 二叉树是一个递归的数据结构,每个节点最多有两个子节点. 通常二叉树是二分查找树,每个节点它的值大于或者等于在它左子树节点上的值,小于或者等于 ...
- leetcode124二叉树最大路径和
第一选择是将其转化成图用动态规划,但这样还是太麻烦 使用递归的思路,对于当前的节点root,分别求左右孩子到当前节点的单项路径权值最大的路径权值,然后记包含当前节点的路径权值为 path_price= ...