zoukankan      html  css  js  c++  java
  • 【BZOJ3203】保护出题人(动态规划,斜率优化)

    【BZOJ3203】保护出题人(动态规划,斜率优化)

    题面

    BZOJ
    洛谷

    题解

    在最优情况下,肯定是存在某只僵尸在到达重点的那一瞬间将其打死
    我们现在知道了每只僵尸到达终点的时间,因为僵尸要依次打死。
    所以我们假设血量的前缀和是(s_i)
    那么我么必须在它到达的时间(t_i)之前打出总共不少于(s_i)的伤害。
    而植物的攻击力是固定的,意味着时间-伤害的坐标系上是一条直线。
    那么现在相当于在时间-伤害的坐标系上有若干个点,每次询问与((0,0))构成斜率最大的那一个。
    但是现在很烦人的一点是,每次都是在最前面插入一个僵尸。
    意味着之前所有点都要移动一个向量((d,a_i))
    那就不动其他的点啊,只要动原点不就好了。。。

    #include<cstdio>
    using namespace std;
    #define ll long long
    #define RG register
    #define MAX 111111
    inline ll read()
    {
        RG int x=0,t=1;RG char ch=getchar();
        while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
        if(ch=='-')t=-1,ch=getchar();
        while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
        return x*t;
    }
    struct Node{double x,y;}p[MAX];
    double Slope(Node a,Node b){return (a.y-b.y)/(a.x-b.x);}
    int n,Q[MAX],t;
    double d,a,b,ans,s;
    int main()
    {
    	n=read();d=read();
    	for(int i=1;i<=n;++i)
    	{
    		a=read();b=read();p[i].x-=s;s+=a;p[i].y=-i*d;
    		while(t>1&&Slope(p[i],p[Q[t]])>Slope(p[Q[t]],p[Q[t-1]]))--t;
    		Q[++t]=i;p[0].x=-s;p[0].y=-i*d-b;int l=1,r=t;
    		while(l<r)
    		{
    			int mid=(l+r)>>1;
    			if(Slope(p[Q[mid]],p[Q[mid+1]])>Slope(p[Q[mid+1]],p[0]))l=mid+1;
    			else r=mid;
    		}
    		ans+=1/Slope(p[Q[l]],p[0]);
    	}
    	printf("%.0lf
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    linux常用命令全拼
    foxmail怎么设置个性签名
    linux下kerberos教程
    linux解压war包的命令
    Jenkins部署Web项目到远程tomcat(通过jenkins插件)
    Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
    windows下命令行终端使用rz上传文件参数详解
    svn 命令行下常用的几个命令
    性能测试指标及解释
    性能测试的分类及各分类理解
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9306799.html
Copyright © 2011-2022 走看看