[JSOI2016]灯塔

[JSOI2016]灯塔

https://ac.nowcoder.com/acm/problem/20227

分析

读完题,我们发现为了满足所有节点 。通过不等式变形 。那么我们就有了 的做法,是过不了的,所以必须优化,我们现在为了去掉绝对值符号,所以考虑从左到右和从右到左分别进行一次转移。令 。那么,根据 的函数图像非常容易得到


那么满足这个式子的,我们直接通过决策单调性优化就好了,时间复杂度为 ,在 上还有一个加强版 。卡掉了分块+rmq的做法。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10,inf = 2e9;
int ans[2][N],h[N],n;
int read() {
    int x=0;char ch = getchar();
    while(!isdigit(ch)) {ch = getchar();}
    while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}return x;    
}
void solve(int l,int r,int vl,int vr,int opt) {
    int mid = l + r >> 1;
    double Max = -2e9;int pos = 0;
    for(int p = vl;p <= mid && p <= vr;p++) {
        double val = h[p] - h[mid] + sqrt(mid - p);
        if(val > Max) {
            pos = p;Max = val;
        }
    }
    ans[opt][mid] = ceil(Max);
    if(l <= mid - 1) solve(l,mid-1,vl,pos,opt);
    if(mid + 1 <= r) solve(mid+1,r,pos,vr,opt);
}
int main() {
    n = read();
    for(int i = 1;i <= n;i++) h[i] = read();
    solve(1,n,1,n,0);
    reverse(h+1,h+1+n);
    solve(1,n,1,n,1);
    reverse(ans[1]+1,ans[1]+1+n);
    for(int i = 1;i <= n;i++) {
        printf("%d\n",max(ans[1][i],ans[0][i]) );
    }
}
全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
10-15 15:00
潍坊学院 golang
跨考小白:这又不是官方
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务