BZOJ_1713_[Usaco2007 China]The Bovine Accordion and Banjo Orchestra 音乐会_斜率优化
BZOJ_1713_[Usaco2007 China]The Bovine Accordion and Banjo Orchestra 音乐会_斜率优化
Description
Input
第1行输入N,之后N行输入Ai,之后N行输入Bi.
Output
输出最大收益.
Sample Input
1
1
5
5
1
1
INPUT DETAILS:
There are 6 cows: 3 accordionists and 3 banjoists. The accordionists have
talent levels (1, 1, 5), and the banjoists have talent levels (5, 1, 1).
Sample Output
HINT
手风琴手3和班卓琴手1搭配,创造收益25美元.手风琴手1和手风琴手2喝酒用了4美元.同样班卓琴手2和班卓琴手3用了4美元.最后收益为25 -4-4=17美元
设F[i][j]表示手风琴手匹配到第i个,班卓琴手匹配到第j个的最大收益。
F[i][j]=F[k][l]+A[i]*B[j]-(sa[i-1]-sa[k])^2-(sb[j-1]-sb[l])^2。
因为A[i]*B[j]一定是正的,所以选的越多越好。
转移只有两个是有用的,F[i][j]从F[i-1][k]和F[k][j-1]转移。
斜率优化即可。注意L和R都要用数组来保存,Q也要开成二维的。
两个队列分别存i和j。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef double f2;
typedef long long ll;
#define N 1050
#define eps 1e-6
int a[N],b[N],n,l1[N],r1[N],l2[N],r2[N];
ll sa[N],sb[N],ans,f[N][N];
f2 gK(ll x,ll y,ll z,ll w) {
if(z==x) return w>y?1e10:-1e10;
return (1.0*w-y)/(z-x);
}
struct Point {
ll x,y;
int k;
}Q1[N][N],Q2[N][N];
f2 Slp(const Point &a,const Point &b) {
if(a.x==b.x) return b.y>a.y?1e10:-1e10;
return 1.0*(b.y-a.y)/(b.x-a.x);
}
#define X1(k) (sb[k])
#define Y1(k,i) (f[i-1][k]-sb[k]*sb[k])
#define X2(k) (sa[k])
#define Y2(k,j) (f[k][j-1]-sa[k]*sa[k])
int main() {
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;i++) scanf("%d",&a[i]),sa[i]=sa[i-1]+a[i];
for(i=1;i<=n;i++) scanf("%d",&b[i]),sb[i]=sb[i-1]+b[i];
ans=-1ll<<60;
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
f[i][j]=a[i]*b[j]-sa[i-1]*sa[i-1]-sb[j-1]*sb[j-1];
//
while(l1[i]<r1[i]-1&&Slp(Q1[i][l1[i]],Q1[i][l1[i]+1])>-2*sb[j-1]) l1[i]++;
k=Q1[i][l1[i]].k;
if(l1[i]<r1[i]) f[i][j]=max(f[i][j],f[i-1][k]+a[i]*b[j]-(sb[j-1]-sb[k])*(sb[j-1]-sb[k]));
//
while(l2[j]<r2[j]-1&&Slp(Q2[j][l2[j]],Q2[j][l2[j]+1])>-2*sa[i-1]) l2[j]++;
k=Q2[j][l2[j]].k;
if(l2[j]<r2[j]) f[i][j]=max(f[i][j],f[k][j-1]+a[i]*b[j]-(sa[i-1]-sa[k])*(sa[i-1]-sa[k])); if(i>=2) {
Point tmp=(Point){sb[j],f[i-1][j]-sb[j]*sb[j],j};
while(l1[i]<r1[i]-1&&Slp(Q1[i][r1[i]-1],tmp)>Slp(Q1[i][r1[i]-2],Q1[i][r1[i]-1])) r1[i]--;
Q1[i][r1[i]++]=tmp;
}
if(j>=2) {
Point tmp=(Point){sa[i],f[i][j-1]-sa[i]*sa[i],i};
while(l2[j]<r2[j]-1&&Slp(Q2[j][r2[j]-1],tmp)>Slp(Q2[j][r2[j]-2],Q2[j][r2[j]-1])) r2[j]--;
Q2[j][r2[j]++]=tmp;
}
ans=max(ans,f[i][j]-(sa[n]-sa[i])*(sa[n]-sa[i])-(sb[n]-sb[j])*(sb[n]-sb[j]));
}
}
printf("%lld\n",ans);
}
BZOJ_1713_[Usaco2007 China]The Bovine Accordion and Banjo Orchestra 音乐会_斜率优化的更多相关文章
- 【BZOJ1713】[Usaco2007 China]The Bovine Accordion and Banjo Orchestra 音乐会 斜率优化
[BZOJ1713][Usaco2007 China]The Bovine Accordion and Banjo Orchestra 音乐会 Description Input 第1行输入N,之后N ...
- [USACO Special 2007 Chinese Competition]The Bovine Accordion and Banjo Orchestra
[原题描述以及提交地址]:http://acm.tongji.edu.cn/problem?pid=10011 [题目大意] 给定两个长度为N的序列,要给这两个序列的数连线.连线只能在两个序列之间进行 ...
- 1712: [Usaco2007 China]Summing Sums 加密
1712: [Usaco2007 China]Summing Sums 加密 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 338 Solved: 12 ...
- BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法
BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法 Description 那N只可爱的奶牛刚刚学习了有关密码的许多算法,终于,她们创造出了属于奶牛 ...
- bzoj 1712: [Usaco2007 China]Summing Sums 加密
1712: [Usaco2007 China]Summing Sums 加密 Description 那N只可爱的奶牛刚刚学习了有关密码的许多算法,终于,她们创造出了属于奶牛的加密方法.由于她 ...
- BZOJ1712 : [Usaco2007 China]Summing Sums 加密
设$s[i]$为进行$i$次加密后所有奶牛数字的和,有$s[i]=(n-1)s[i-1]$. 设$c[i]$为某头固定的奶牛进行$i$次加密后的数字, 若$i$为奇数,有: \[c[i]=((1-n) ...
- 【bzoj1712】[Usaco2007 China]Summing Sums 加密 矩阵乘法
题目描述 那N只可爱的奶牛刚刚学习了有关密码的许多算法,终于,她们创造出了属于奶牛的加密方法.由于她们并不是经验十足,她们的加密方法非常简单:第i只奶牛掌握着密码的第i个数字,起始的时候是Ci(0≤C ...
- [bzoj1704][Usaco2007 Mar]Face The Right Way 自动转身机_贪心
Face The Right Way 自动转身机 bzoj-1704 Usaco-2007 Mar 题目大意:不想描述题意系列++... ...题目链接 注释:略. 想法:我们直接枚举k,然后从左往右 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- [JSOI2016]反质数序列
我竟然半个小时切了一道JSOI2016,,,,不敢相信. 首先可以发现,如果N个数中1出现的次数<=1的话,我们按不能在一个集合连无向边的话,连出的一定是一个二分图. 接下来我来证明一下: 因为 ...
- java集合系列之ArrayList源码分析
java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...
- 【Java TCP/IP Socket】TCP Socket(含代码)
TCP的Java支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议.TCP协议和UDP协议.现 ...
- 前端和后端采用接口访问时的调用验证机制(基于JWT的前后端验证)(思路探讨)
说明:基于前后端,尤其是使用Ajax请求的接口,现在市面上网页上调用的Ajax基本都是没有验证的,如果单独提取之后可以无线的刷数据. 继上一篇http://www.cnblogs.com/EasonJ ...
- axis2调用WSDL接口
public static JSONObject sendWsdl(String url,String xmlStr){ JSONObject res=new JSONObject(); try { ...
- graphviz的使用
安装:brew install graphviz 使用:dot -Tpng *.dot -o *.png 把dot文件转换为图片,* 换成具体的文件名, 这样你就成功的用脚本渲染出你要绘制的图片啦 参 ...
- sklearn 特征选择
1.移除低方差的特征(Removing features with low variance) VarianceThreshold 是特征选择中的一项基本方法.它会移除所有方差不满足阈值的特征.默认设 ...
- UVA - 11178-Morley’s Theorem
就是给出一个等边三角形的三个顶点坐标 然后每一个角的三等分线会交错成一个三角形,求出这个三角形的顶点坐标 一開始.我题意理解错了--还以为是随意三角形,所以代码可以处理随意三角形的情况 我的做法: 通 ...
- Codeforces Round #258 (Div. 2/A)/Codeforces451A_Game With Sticks
解题报告 http://blog.csdn.net/juncoder/article/details/38102263 n和m跟木棍相交,问一人取一交点(必须是交点.且取完后去掉交点的两根木棍),最后 ...
- Computer form factor
http://en.wikipedia.org/wiki/Motherboard_form_factor Computer form factor From Wikipedia, the free e ...