7.10省队集训梦工厂

原创 2015年07月10日 15:23:06


思路:题面真心长....单调栈维护上凸壳即可

设sum[i]为前i道工序的复杂度之和,g[i]为第i个快乐最早开始生产的时间。因为我们要保证没有两个快乐同时出现在同一道工序,所以

g[i]=g[i-1]+max(sum[j]*f[i-1]-sum[j-1]*f[i])

然后就是像斜率优化的过程了

sum[j]*f[i-1]=f[i]*sum[j-1]+g[i]-g[i-1]

sum[j]=f[i]/f[i-1]*sum[j-1]+(g[i]-g[i-1])/f[i-1]

     y     =     k     *       x       +              b

于是可以发现使g[i]最大的点一定在一个上凸壳上,因为查询的斜率f[i]/f[i-1]不单调,用单调栈维护,二分查询即可。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define max(a,b) (a>b?a:b)
#define ll long long
const int maxn=2000010,inf=(int)1e9;
const double eps=1e-9;
using namespace std;
int n,m,sum[maxn],f[maxn],t[maxn],q[maxn],top;ll tim,g[maxn];char ch;
void read(int &x){
    for (ch=getchar();!isdigit(ch);ch=getchar());
    for (x=0;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
}
 
double slope(int i,int j){
    if (i==0||j==0) return inf;
    if (i==inf||j==inf) return -inf;
    return 1.0*(sum[i]-sum[j])/(double)(sum[i-1]-sum[j-1]);
}
 
void work(){
    q[1]=0,q[2]=1,top=2,q[top+1]=inf,g[1]=0;
    for (int i=2;i<=n;i++){
        for (;top&&slope(i,q[top])>slope(q[top],q[top-1])+eps;) {
            top--;
        }
        q[++top]=i,q[top+1]=inf;
    }
    for (int i=2;i<=m;i++){
        int l=1,r=top,mid=(l+r)>>1;double k=(1.0*f[i])/(1.0*f[i-1]);
        while (1){
            if (slope(q[mid],q[mid-1])+eps>=k&&slope(q[mid],q[mid+1])<=k+eps) break;
            else if (slope(q[mid],q[mid+1])>k+eps) l=mid+1;
            else r=mid-1;
            mid=(l+r)>>1;
        }
        g[i]=g[i-1]+(ll)sum[q[mid]]*f[i-1]-(ll)sum[q[mid]-1]*f[i];
    }
    printf("%lld\n",1ll*(g[m]+1ll*sum[n]*f[m]));
}
 
int main(){
    freopen("yume.in","r",stdin);freopen("yume.out","w",stdout);
    read(n),read(m);
    for (int i=1;i<=n;i++) read(t[i]),sum[i]=sum[i-1]+t[i];
    for (int i=1;i<=m;i++) read(f[i]);
    work();
    fclose(stdout);
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

2015湖南省队集训DAY8——梦工厂

梦工厂 (yume.cpp/c/pas)Time Limit: 1 s Memory Limit: 128 M 问题描述「有时候用烂了的名字也会别有深意」 ——摘自EN 语录 “这里是...

7.5省队集训 tree

Tree  【题目描述】  RHL 有一天看到 lmc 在玩一个游戏。  “愚蠢的人类哟,what are you doing”,RHL 说。  “我在玩一个游戏。现在这里有一个有 n 个结点的有根树...

jsoi2012省队集训:集合计数

【问题描述】 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007。(是质数哦...

sd省队集训二轮tree

感觉这题应该跟hdu5290很像,结果它们果然系出同源; 这个题应该处于更根源的位置; 根据算法3的思想,令dp[i][j][k]表示以i为根的子树且已经使用了j个黑点,最深未被覆盖的长度或者沿...

河南省省队集训 有趣的游戏

补上题面 【题目描述】 阿法汪和贝塔喵是两个绝顶聪明的AI,如今他们在玩一个很有趣的游戏。 游戏规则是这样的:有一棵有根树,这颗树的每个叶子上都有一个金币,每个金币都有各自的价值Wi。最开始...

集训Stage 1-Part 2-2017.7.3~7.10总结

7.3状态依然不佳,T2,T3都是原题,T2一年前切懒得做,T3做过却不忘记做法,一直死磕好久,最后只T3 100收场Rank 13近乎垫底 做过的题没印象,简单经典DP模型不会(基础缺漏)7.4题...

Dt大数据梦工厂王家林老师 Scala实战详解之第8讲 Scala主构造器、私有构造器、构造器重载实战详解

package com.dt.scalaInAction.demo_008class Teacher { //class Teacher() 也可行 不写"()"则()为类默认的无参的主构造器 var...
  • sd637
  • sd637
  • 2015-09-15 01:09
  • 265

读书笔记--盗梦工厂--2014年03月03日

在学校里,我们创造了一个自尊心的真空,一个唯分数或运动队是举的荒漠。学生在学校获得尊重的唯一途径,是得到一毕业就绝难碰面的老师的认可。如果这个老师是个喜怒无常、小题大做、朝令夕改的人,学生也只能忍耐。...

Dt大数据梦工厂王家林老师 Scala实战详解之第11讲 Scala中的apply实战详解

package com.dt.scalaInAction.demo_011class ApplyTest { def apply() = { println("I am into Spark so m...
  • sd637
  • sd637
  • 2015-09-15 01:12
  • 250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)