Array GCD CodeForces - 624D (dp,gcd)
大意: 给定序列, 给定常数a,b, 两种操作, (1)任选一个长为$t$的子区间删除(不能全部删除), 花费t*a. (2)任选$t$个元素+1/-1, 花费t*b. 求使整个序列gcd>1的最少花费.
题目有个限制是不能全部删除, 所以最后一定剩余a[1]或a[n], 暴力枚举a[1]与a[n]的所有素因子即可.
这场div. 2题目感觉都挺简单的, 但实现起来各种出错...........各种细节还是没考虑好......
#include <iostream>
#include <vector>
#include <cmath>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define pb push_back
using namespace std;
typedef long long ll; const ll INF = 0x3f3f3f3f3f3f3f3f;
const int N = 1e6+10;
int n, x, y;
int a[N], b[N];
ll ans, dp[3][N]; ll solve(int g, int *a, int n) {
memset(dp,0x3f,sizeof dp);
dp[0][0]=dp[1][0]=dp[2][0]=0;
REP(i,1,n) {
dp[0][i] = dp[0][i-1];
dp[1][i] = min(dp[0][i-1]+x,dp[1][i-1]+x);
dp[2][i] = min({dp[0][i-1],dp[1][i-1],dp[2][i-1]});
if (a[i]%g) {
if ((a[i]-1)%g==0||(a[i]+1)%g==0) dp[0][i]+=y,dp[2][i]+=y;
else dp[0][i]=dp[2][i]=INF;
}
}
return min(dp[1][n],dp[2][n]);
} vector<int> fac(int num) {
int mx = sqrt(num+0.5);
vector<int> v;
REP(i,2,mx) if (num%i==0) {
v.pb(i);
while (num%i==0) num/=i;
}
if (num>1) v.pb(num);
return v;
} void solve(int num, int *a, int n, int tp) {
vector<int> g = fac(num);
for (auto &&t:g) ans = min(ans, solve(t,a,n)+tp*y);
} int main() {
scanf("%d%d%d", &n, &x, &y);
REP(i,1,n) scanf("%d", a+i);
ans = INF;
solve(a[1],a+1,n-1,0);
solve(a[1]-1,a+1,n-1,1);
solve(a[1]+1,a+1,n-1,1);
solve(a[n],a,n-1,0);
solve(a[n]-1,a,n-1,1);
solve(a[n]+1,a,n-1,1);
printf("%lld\n", ans);
}
Array GCD CodeForces - 624D (dp,gcd)的更多相关文章
- Array Beauty CodeForces - 1189F (dp,好题)
大意: 定义$n$元素序列$a$的美丽度为 $\min\limits_{1\le i<j\le n}|a_i-a_j|$. 给定序列$a$, 求$a$的所有长为$k$的子序列的美丽度之和. 记 ...
- CodeForces - 803C Maximal GCD 【构造】
You are given positive integer number n. You should create such strictly increasing sequence of k po ...
- HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)
树状数组... Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/6 ...
- iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组
一.GCD的基本使用 <1>GCD简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 G ...
- codechef Dynamic GCD [树链剖分 gcd]
Dynamic GCD 题意:一棵树,字词树链加,树链gcd 根据\(gcd(a,b)=gcd(a,a-b)\) 得到\(gcd(a_1, a_2, ..., a_i) = gcd(a_1, a_1- ...
- 【CodeForces 624D】Array GCD
题 You are given array ai of length n. You may consecutively apply two operations to this array: remo ...
- 【CodeForces 624D/623B】Array GCD
题 You are given array ai of length n. You may consecutively apply two operations to this array: remo ...
- Recovering BST CodeForces - 1025D (区间dp, gcd)
大意: 给定$n$个数, 任意两个$gcd>1$的数间可以连边, 求是否能构造一棵BST. 数据范围比较大, 刚开始写的$O(n^3\omega(1e9))$竟然T了..优化到$O(n^3)$才 ...
- UESTC 923 稳住GCD DP + GCD
定义:dp[i][j] 表示 在前i个数中,使整个gcd值为j时最少取的数个数. 则有方程: gg = gcd(a[i],j) gg == j : 添加这个数gcd不变,不添加, dp[i][j] ...
随机推荐
- GreenPlum 大数据平台--基础使用(一)
一,操作语法 01,创建数据库 --创建用户-- [gpadmin@greenplum01 ~]$ export PGDATABASE=testDB --指定数据库名字 [gpadmin@greenp ...
- 查看mysql版本的四种方法及常用命令
1:在终端下:mysql -V或mysql -Version. 以下是代码片段: [shengting@login ~]$ mysql -V mysql Ver 14.7 Distrib 4.1.10 ...
- SQL脚本整理系列一 表分区
表分区的目的: 1.把历史数据放到另外一个表里面 可以提高查询效率 当然如果经常查询历史数据和新数据的合并结果集这样做就大大的不好了 2.通过把一个表放到不同的文件,不同的文件再存储到不同的磁盘列阵中 ...
- NPOI之C#下载Excel
Java中这个类库叫POI,C#中叫NPOI,很多从Java一直到.Net平台的类库为了区别大部分都是在前面加个N,比如Hibernate和NHibernate. npoi下载地址 一.使用NPOI下 ...
- sql 全局查询
select * from sysobjects o ,syscomments c where o.id=c.id and text like '%ST_Status%'
- Spring Chapter4 WebSocket 胡乱翻译 (一) 一个例子
因为没有基础,不知道从哪里入手. 文档里的例子,https://github.com/rstoyanchev/spring-websocket-portfolio,这个除了WebSocket,还整了S ...
- PAT 1062 Talent and Virtue
#include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #i ...
- 科学计算基础包——Numpy
一.NumPy简介 NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. 1.NumPy的主要功能 (1)ndarray:一个多维数组结构,高效且节省空间. (2)无需 ...
- scss-数据类型
scss当前支持七种主要数据类型 (1).数字,1, 2, 13, 10px. (2).字符串,有引号字符串与无引号字符串,"foo", 'bar', baz. (3).颜色,bl ...
- vue+mock.js+element-ui模拟数据搞定分页
效果如图: 前提是搭好vue前端框架,npm install mockjs引入mock.js 当前页全部代码如下,其他有关element-ui的引入未提到,仅作参考用 <!-- 用户管理 --& ...