CEOI2004锯木厂选址
2024-09-18 03:33:14
斜率优化
# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <string.h>
# include <algorithm>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
IL ll Read(){
RG char c = getchar(); RG ll x = 0, z = 1;
for(; c > '9' || c < '0'; c = getchar()) z = c == '-' ? -1 : 1;;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - '0';
return x * z;
}
const int MAXN(20010), INF(2e9);
int n, Q[MAXN], tail, head, w[MAXN], d[MAXN];
int dis[MAXN], s[MAXN], ans, f[MAXN], c[MAXN], g[MAXN];
IL double Calc(RG int i, RG int j){
return 1.0 * (c[i] - c[j]) / (w[i] - w[j]);
}
int main(){
n = Read();
for(RG int i = 1; i <= n; i++)
w[i] = w[i - 1] + Read(), d[i] = Read();
for(RG int i = 1; i <= n + 1; i++){
dis[i] = dis[i - 1] + d[i - 1];
s[i] = s[i - 1] + w[i - 1] * d[i - 1];
c[i] = w[i] * dis[i];
}
for(RG int i = 1; i <= n; i++)
g[i] = s[n + 1] + c[i] - w[i] * dis[n + 1];
ans = INF;
Q[0] = 1;
for(RG int i = 2; i <= n; i++){
while(head < tail && Calc(Q[head], Q[head + 1]) <= dis[i]) head++;
RG int j = Q[head];
ans = min(ans, g[i] + c[j] - w[j] * dis[i]);
while(head < tail && Calc(Q[tail - 1], Q[tail]) >= Calc(Q[tail], i)) tail--;
Q[++tail] = i;
}
printf("%d\n", ans);
return 0;
}
最新文章
- 简述 OAuth 2.0 的运作流程
- Xcode7使用插件的简单方法&;&;以及怎样下载到更早版本的Xcode
- 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)
- java常见异常集锦
- schema对象介绍
- 像C++一样写JavaScript
- hex和bin文件格式的区别
- Java IO流分析整理 .
- c语言线性表
- CSS一些设置用法
- InputStream中read()与read(byte[] b)
- HDU 2454 Degree Sequence of Graph G(Havel定理 推断一个简单图的存在)
- USACO Section 1.3 Combination Lock 解题报告
- LeetCode &; Q189-Rotate Array-Easy
- hbase高性能读取数据
- kubernetes 简单service的例子
- aptana怎么显示空格 tab和回车等
- PAT 1027 打印沙漏(20)(思路)
- javascript基于原型的语言的特点
- 用NPOI创建Excel、合并单元格、设置单元格样式、边框的方法