zoukankan      html  css  js  c++  java
  • [POI2011]Lightning Conductor

    传送门

    Description

    已知一个长度为n的序列(a_1,a_2,...,a_n)

    对于每个(1leq ileq n),找到最小的非负整数(p)满足 对于任意的(j), (a_j leq a_i + p - sqrt{abs(i-j)})

    Solution

    去掉(abs)容易,前后各扫一遍就可以了。

    (f[i]=max(num[j]-num[i]+sqrt{i-j}))

    函数(f(x)=sqrt x)的增长率越来越慢

    如果当前最优转移为(k),可知之后的最优转移必然(>=k)


    这题是决策单调性的题目。

    决策单调性的核心是利用决策点单调的性质,维护一个决策点的队列,满足任何时候后面的点都不优于前面的点,否则就把队首的元素pop掉,用二分就可以算出一个点优于前一个点时间,显然这个时间是应该单增的。

    Code 

    #include<bits/stdc++.h>
    #define ll long long
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    	return x*f;
    }
    #define MN 500005
    int n,a[MN],t[MN];
    double f[MN],sq[MN];
    int l,r,q[MN];
    inline void rw(double &x,double y){if(y>x) x=y;}
    inline double calc(int T,int x){return a[x]+sq[T-x];}
    inline int get(int x,int y)
    {
    	int l=y,r=n,mid,ans=n+1;
    	while(l<=r)
    	{
    		mid=(l+r)>>1;
    		if(calc(mid,x)<=calc(mid,y)) ans=mid,r=mid-1;
    		else l=mid+1;
    	}
    	return ans;
    }
    int main()
    {
    	n=read();
    	register int i;
    	for(i=1;i<=n;++i) a[i]=read(),f[i]=0.;
    	for(i=1;i<=n;++i) sq[i]=sqrt((double)i);
    	for(l=1,r=0,i=1;i<=n;++i)
    	{
    		for(;l<r&&calc(t[r-1],q[r])<calc(t[r-1],i);) --r;
            if(r) t[r]=get(q[r],i);q[++r]=i;
            for(;l<r&&t[l]<=i;) ++l;
            rw(f[i],calc(i,q[l]));
        }
        memset(t,0,sizeof t);
        for(i=1;i+i<=n;++i) std::swap(a[i],a[n-i+1]),std::swap(f[i],f[n-i+1]);
        for(l=1,r=0,i=1;i<=n;++i)
    	{
    		for(;l<r&&calc(t[r-1],q[r])<calc(t[r-1],i);) --r;
            if(r) t[r]=get(q[r],i);q[++r]=i;
            for(;l<r&&t[l]<=i;) ++l;
            rw(f[i],calc(i,q[l]));
        }
        for(i=n;i;--i) printf("%.0lf
    ",max(0,ceil(f[i])-a[i]));
        return 0;
    }
    


    Blog来自PaperCloud,未经允许,请勿转载,TKS!

  • 相关阅读:
    (转)非常好的协同过滤入门文章
    PHP错误:Call to undefined function curl_init()
    (转)Ubuntu下Apache、php、mysql默认安装路径
    (转)matlab各类数学公式
    centos7下安装momgodb3
    centos7 使用mount 挂载window10 (超简单)
    Centos7 安装nginx1.14
    Centos7 安装MySQL5.7
    python3.5 安装 numpy1.14.4
    python3 tkinter 桌面软件教程
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/10241942.html
Copyright © 2011-2022 走看看