“景驰科技杯”2018年华南理工大学程序设计竞赛 G. Youhane as "Bang Riot"(斜率DP)
题目链接:https://www.nowcoder.com/acm/contest/94/G
题意:中文题目,见链接
题解:设 sum[i] 为 a[i] 的前缀和,可得公式
dp[i] = min( dp[j] + ( sum[i] - sum[j] - b[i] ) ^ 2 )
= min( dp[j] + sum[j] ^ 2 + 2 * ( sum[i] - b[i] ) * ( sum[i] - sum[j] ) + sum[i] - b[i] ) ^ 2
设 y = dp[j] + sum[j] ^ 2,k = sum[i] - b[i],x = sum[i] - sum[j],b = sum[i] - b[i] ) ^ 2
有 y = 2 * k * x + b
因为 k 的正负不确定,但 y 和 x 符合单调性,故可以二分找出第一个比当前点斜率大的点来维护下凸性(注意最好手写二分,使用lower_bound可能会出错)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 1e6 + ;
const int MAXM = 1e3 + ;
const ll mod = ; int n,tail;
int q[MAXN];
ll a[MAXN],b[MAXN],sum[MAXN],dp[MAXN];
double k[MAXN]; ll sqr(ll x) {
return x * x;
} ll getup(int j,int k) {
return dp[j] + sqr(sum[j]) - (dp[k] + sqr(sum[k]));
} ll getdown(int j,int k) {
return 2ll * (sum[j] - sum[k]);
} int findd(double x) {
int l = , r = tail - , ans = ;
while(l <= r) {
int mid = (l + r) >> ;
ll up = dp[q[mid]] + sqr(sum[q[mid]]) - (dp[q[mid - ]] + sqr(sum[q[mid - ]]));
ll down = 2.0 * (sum[q[mid]] - sum[q[mid - ]]);
if(up <= down * x) l = mid + , ans = mid;
else r = mid - ;
}
return q[ans];
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
#endif
sum[] = dp[] = ;
while(~scanf("%d",&n)) {
for(int i = ; i <= n; i++) {
scanf("%lld",&a[i]);
sum[i] = sum[i - ] + a[i];
}
for(int i = ; i <= n; i++) scanf("%lld",&b[i]);
tail = ;
q[tail++] = ;
for(int i = ; i <= n; i++) {
int id = findd(1.0 * (sum[i] - b[i]));
dp[i] = dp[id] + sqr(sum[i] - sum[id] - b[i]);
while( < tail && getup(q[tail - ],q[tail - ]) * getdown(i,q[tail - ]) >= getup(i,q[tail - ]) * getdown(q[tail - ],q[tail - ]))
tail--;
if(getdown(i,q[tail - ]) == ) k[tail] = 1e18;
else k[tail] = 1.0 * getup(i,q[tail - ]) / getdown(i,q[tail - ]);
q[tail++] = i;
}
printf("%lld\n",dp[n]);
}
return ;
}
“景驰科技杯”2018年华南理工大学程序设计竞赛 G. Youhane as "Bang Riot"(斜率DP)的更多相关文章
- “景驰科技杯”2018年华南理工大学程序设计竞赛 B. 一级棒!(并查集)
题目链接:https://www.nowcoder.com/acm/contest/94/B 题意:在一棵有 n 个节点的树上,有两种操作,一个是把 u 到 v 的路径走一遍,另一个是查询 u 到 f ...
- “景驰科技杯”2018年华南理工大学程序设计竞赛 A. 欧洲爆破(思维+期望+状压DP)
题目链接:https://www.nowcoder.com/acm/contest/94/A 题意:在一个二维平面上有 n 个炸弹,每个炸弹有一个坐标和爆炸半径,引爆它之后在其半径范围内的炸弹也会爆炸 ...
- 2018华南理工大学程序设计竞赛 H-对称与反对称
H-对称与反对称 题目描述 给出一个N*N的方阵A.构造方阵B,C: 使得A = B + C.其中 B为对称矩阵,C为反对称矩阵. 对于方阵S中的任意元素,若(S)ij = (S)ji,则称S为对称矩 ...
- A NB群友 【记忆化搜索】(2019年华南理工大学程序设计竞赛(春季赛))
冲鸭!去刷题:https://ac.nowcoder.com/acm/contest/625/A 题目描述 CC是著名的算法竞赛选手,他不仅人长得帅,而且技术了得,自然而然就有了许多粉丝. 为了能帮助 ...
- 2018年浙江理工大学程序设计竞赛校赛 Problem I: 沙僧
沙僧 思路: dfs序+差分数组 分层考虑,通过dfs序来查找修改的区间段,然后用差分数组修改 代码: #include<bits/stdc++.h> using namespace st ...
- 2019年华南理工大学程序设计竞赛(春季赛)-C-六学家的困惑
题目链接:https://ac.nowcoder.com/acm/contest/625/C 题意:给定两个字符串,每次只能从两个字符串的两端取字符,求依次取字符后所构成的数字最大为多少. 思路:思路 ...
- 2019年华南理工大学程序设计竞赛(春季赛)-H-Parco_Love_GCD
题目链接:https://ac.nowcoder.com/acm/contest/625/H 题意:给定n个数(<=1e9)的序列,其中n<=5e5,求该序列所有子序列的对应的gcd对1e ...
- 2018年长沙理工大学程序设计竞赛 J - 杯子
题意: 链接:https://www.nowcoder.com/acm/contest/96/J一天durong同学买了一个无限长的杯子,同时买了n个球,并且标号为1,2,3......n,duron ...
- C 六学家的困惑 【YY】 (2019年华南理工大学程序设计竞赛(春季赛))
冲鸭,去刷题:https://ac.nowcoder.com/acm/contest/625/C 小六喜欢两全其美的事情,今天就正好有一个这样的机会. 小六面前有两根管子,管子里面放满了数字为1到9的 ...
随机推荐
- 2019牛客多校赛第一场 补题 I题
I题 Points Division 题意: 给你n个点,每个点有坐标(xi,yi)和属性(ai,bi),将点集划分为两个集合, 任意 A 集合的点 i 和 B 集合点 j, 不允许 xi > ...
- 《C++ Primer》读书笔记之第15章:面向对象编程
一.面向对象概述 1. 面向对象的三个基本特性 封装.继承和多态. 2. 封装 指把隐藏对象的实现细节,仅对外提供接口,从而达到接口与实现分离的效果.封装的好处:一是提高数据的安全性,用户只能使用对象 ...
- django fields lookup methods(lookup类型)
__exact 精确等于 like 'aaa' __iexact 精确等于 忽略大小写 ilike 'aaa' __contains 包含 like '%aaa%' __ic ...
- XSSFWorkbook对象 进行zip打包时 用write资源流自动关闭处理办法
XSSFWorkbook对象的write方法内会将传入的资源流自动关闭 导致下载excel失败 错误代码 OutputStream out = response.getOutputStream(); ...
- 什么是云解析DNS?
产品概述 云解析DNS(Alibaba Cloud DNS)是一种安全.快速.稳定.可扩展的权威DNS服务,云解析DNS为企业和开发者将易于管理识别的域名转换为计算机用于互连通信的数字IP地址,从而将 ...
- Escape(多记一个方向状态的BFS)迷宫逃脱
题意:https://www.nitacm.com/problem_show.php?pid=2266 vis记[x][y][dir]三个状态就行. 引用:https://blog.csdn.net/ ...
- MySQL 数据库面试题
原文出处:https://juejin.im/post/5a9ca0d6518825555c1d1acd 作者:Java3y 本文在原文基础上进行修改,而且没有特定针对MySQL. 一.存储过程(以及 ...
- MyBatis 源码篇-日志模块2
上一章的案例,配置日志级别为 debug,执行一个简单的查询操作,会将 JDBC 操作打印出来.本章通过 MyBatis 日志部分源码分析它是如何实现日志打印的. 在 MyBatis 的日志模块中有一 ...
- spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目
spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目 [V1.2.3-RELEASE] 2019.09.09
- [转载]sklearn多分类模型
[转载]sklearn多分类模型 这篇文章很好地说明了利用sklearn解决多分类问题时的implement层面的内容:https://www.jianshu.com/p/b2c95f13a9ae.我 ...