“景驰科技杯”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的 ...
随机推荐
- 微信公众号通过用户授权获取用户基本信息java版
公司需要开发一个微信公众号,要求用户通过公众号登录公司网站时候自动获取用户的基本信息,在网上查资料发现大部分都是直接copy微信公众平台的开发文档,感觉还是介绍的不是太小白,所以为了方便大家也为了自己 ...
- 基于NIO写的阻塞式和非阻塞式的客户端服务端
由于功能太过简单,就不过多阐述了,直接上阻塞式代码: package com.lql.nio; import org.junit.Test; import java.io.IOException; i ...
- 20190804-Python基础 第一章
学习爬虫的同时,补充学习更多Python的基础知识,才能让所学更加扎实. 至今,所学的很多东西,基础都不牢固,导致这些所学都是浅尝则止的皮毛,不能真正上战场,故借速成之心,踏实打牢基础,举一反三,以求 ...
- 【Python基础】13_Python中的PASS
pass关键字的使用 在程序分支中,如果不想立刻执行该分支,可使用pass占位符,pass不表示任何含义,仅保证程序不会报错. 如: action_str = input("请选择希望执行的 ...
- Centos7搭建在线yum源
1: 首先关闭防护墙或者设置规则通过且关闭selinux Systemctl diablefirewalld 永久关闭防火墙 vim/etc/sysconfig/selinux 并修改SELINUX ...
- 面试官:Kafka 如何优化内存缓冲机制造成的频繁 GC 问题?
Jusfr 原创,转载请注明来自博客园 Request 与 Response 的响应格式 Request 与 Response 都是以 长度+内容 形式描述, 见于 A Guide To The Ka ...
- 怎样使用js将文本复制到系统粘贴板中
需要使用到三个document方法: 1. document.execCommand(); 执行某个命令 2. document.queryCommandSupported(); 检测浏览器是否支持某 ...
- spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目
spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目 [V1.2.3-RELEASE] 2019.09.09
- Java组合模式(思维导图)
图1 组合模式[点击查看图片] 1,以公司职员为例的结构 package com.cnblogs.mufasa.demo3; import java.util.ArrayList; import ja ...
- 2.4 使用 xpath 对xml 进行解析
public class Demo1 { /** * XPath提取XML文档数据 * xpath很强大 用来提取xml文档数据非常方便 * @throws Exception */ public s ...