【POI2011】【BZOJ2216】Lightning Conductor

原创 2016年05月03日 16:03:23

Description

已知一个长度为n的序列a1,a2,…,an。
对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j))

Input

第一行n,(1<=n<=500000)
下面每行一个整数,其中第i行是ai。(0<=ai<=1000000000)

Output

n行,第i行表示对于i,得到的p

Sample Input

6

5

3

2

4

2

4

Sample Output

2

3

5

3

5

4

HINT

Source

随便化一下式子就发现显然是决策单调的..

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define MAXN 500010
#define GET (ch>='0'&&ch<='9')
using namespace std;
template <class classname>
inline void in(classname &x)
{
    char ch=getchar();x=0;
    while (!GET)    ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();
}
int n;
int a[MAXN];
double f[2][MAXN];
struct node
{
    int l,r,x;
    node()  {}
    node(int _l,int _r,int _x)  {   l=_l;r=_r;x=_x; }
}q[MAXN];
inline double calc(int j,int i) {   return a[j]+sqrt(abs(j-i))-a[i];    }
inline int find(node d,int x)
{
    int l=d.l,r=d.r,mid=(l+r)>>1;
    for (;l<=r;mid=(l+r)>>1)   if (calc(x,mid)<calc(d.x,mid))   l=mid+1;    else    r=mid-1;
    return l;
}
void solve(int id)
{
    for (int i=1,h=1,t=0,j;i<=n;i++)
    {
        if (h<=t&&++q[h].l>q[h].r)    h++;f[id][i]=calc(q[h].x,i);
        if (h>t||calc(i,n)>calc(q[t].x,n))
        {
            while (h<=t&&calc(i,q[t].l)>calc(q[t].x,q[t].l))  t--;
            if (h<=t)    j=find(q[t],i),q[t].r=j-1,q[++t]=node(j,n,i);
            else    q[++t]=node(i,n,i);
        }
    }
}
int main()
{
    in(n);
    for (int i=1;i<=n;i++)   in(a[i]);
    solve(0);
    for (int i=1;i<=(n>>1);i++)    swap(a[i],a[n-i+1]);
    solve(1);
    for (int i=1;i<=n;i++)   printf("%d\n",max(0,(int)ceil(max(f[0][i],f[1][n-i+1]))));
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CreationAugust/article/details/51305464

FZU 2129 子序列个数 (动态规划)

子序列的定义:对于一个序列a=a11,a22,......ann。则非空序列a'=ap1p1,ap2p2......apmpm为a的一个子序列,其中1 例如4,14,2,3和14,1,2,3都为4,...
  • GYH0730
  • GYH0730
  • 2017-08-20 20:18:29
  • 156

LIS(最长上升子序列)问题的三种求解方法以及一些例题

摘要本篇博客介绍了求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,后面给出了4道LIS的例题。LIS的定义一个数的序列bi,当b...
  • George__Yu
  • George__Yu
  • 2017-07-23 11:34:23
  • 3267

【bzoj2216】[Poi2011]Lightning Conductor 决策单调性+整体二分

其实看到这道题是毫无思路的。 先简化思路,对于每个i,求max{aj+sqrt(|i-j|)}-ai 把这个式子分成前后两部分,即max(max{aj+sqrt(i-j)},max{ak+sqrt...
  • u012288458
  • u012288458
  • 2016-01-18 15:06:21
  • 925

[POI 2011]Lightning Conductor(DP优化)

题目链接http://main.edu.pl/en/archive/oi/18/pio题目大意已知一个长度为n的序列a1,a2,…,an。 对于每个1...
  • qpswwww
  • qpswwww
  • 2015-06-15 11:42:13
  • 607

[编程题]序列和

[编程题]序列和 给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N。答案可能有多个,我我们需要找出长度最小的那个。 例如 N = 18 L = 2: 5 + 6 ...
  • qq846294282
  • qq846294282
  • 2017-03-15 21:09:29
  • 508

C/C++笔试题(很多)

微软亚洲技术中心的面试题!!! 1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥...
  • weiyuefei
  • weiyuefei
  • 2016-08-29 11:47:44
  • 20419

BZOJ2216 [Poi2011]Lightning Conductor

考虑分j在i前边和后边分别算然后取max 则f[i]=max(a[j]+sqrt(i-j)) 因为根号x函数差分之后单调不增(也就是说是凸函数),所以有决策单调性,注意是根号函数,double类型的,...
  • neither_nor
  • neither_nor
  • 2016-09-01 16:31:19
  • 589

【bzoj2216】 [Poi2011]Lightning Conductor

题目 将题目中所给的式子移项,得到p=aj-ai+sqrt(abs(i-j)), 只考虑j 这个式子具有决策单调性,于是可以分治dp,对于j>i的情况倒着做一遍dp。 代码: #includ...
  • LGLin000
  • LGLin000
  • 2016-06-21 20:34:12
  • 407

算法导论第十五章动态规划

概述: 动态规划是通过组合子问题的解而解决整个问题的。 动态规划适用于子问题不是独立的情况,也就是各子问题的包含公共的子子问题。 动态规划对每个子问题只求解一次,将其结果保存在一张表中。 动态规划通常...
  • z84616995z
  • z84616995z
  • 2014-08-18 13:39:25
  • 12811

晋城一中oj 神奇的序列

思路好题+背包
  • chai_jing
  • chai_jing
  • 2016-11-12 23:19:24
  • 369
收藏助手
不良信息举报
您举报文章:【POI2011】【BZOJ2216】Lightning Conductor
举报原因:
原因补充:

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