[Poi2011]Lightning Conductor题解
P3515 [POI 2011] Lightning Conductor
题目描述
逐渐变化的气候迫使 Byteburg 当局建造一个巨大的避雷针,以保护城市内的所有建筑物。
这些建筑物沿着一条街道排成一行,编号从 111 到 nnn。
建筑物和避雷针的高度是非负整数。
Byteburg 的资金有限,只能建造一个避雷针。
而且,正如你所料,避雷针越高,成本越高。
位于建筑物 iii(高度为 hih_ihi)屋顶上的高度为 kkk 的避雷针可以保护建筑物 jjj(高度为 hjh_jhj),如果满足以下不等式:
k+hi≥hj+∣i−j∣k + h_i \geq h_j + \sqrt{|i-j|}k+hi≥hj+∣i−j∣
其中 ∣i−j∣|i - j|∣i−j∣ 表示 iii 和 jjj 之间的绝对差值。
Byteburg 的市长 Byteasar 请求你的帮助。
编写一个程序,对于每个建筑物 iii,确定如果将避雷针放在建筑物 iii 上,能够保护所有建筑物的避雷针的最小高度。
输入格式
标准输入的第一行有一个整数 nnn (1≤n≤500,0001 \leq n \leq 500,0001≤n≤500,000),表示 Byteburg 中的建筑物数量。
接下来的 nnn 行中的每一行包含一个整数 hih_ihi (0≤hi≤1,000,0000 \leq h_i \leq 1,000,0000≤hi≤1,000,000),表示第 iii 个建筑物的高度。
输出格式
你的程序应输出恰好 nnn 行到标准输出。
第 iii 行应给出一个非负整数 kik_iki,表示第 iii 个建筑物上避雷针的最小高度。
输入输出样例 #1
输入 #1
6
5
3
2
4
2
4
输出 #1
2
3
5
3
5
4
说明/提示
题面翻译由 ChatGPT-4o 提供。
思路
动态规划
决策单调性
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n;
double a[500005],f[500005],sq[500005];
void abc(long long l,long long r,long long x,long long y){
if(l>=r+1){
return ;
}
long long mid=(l+r)/2,p;
double ma=0.00;
for(int i=x;i<=min(mid,y);i++){
if(a[i]+sq[mid-i]>ma){
ma=a[i]+sq[mid-i];
p=i;
}
}
if(ma>f[mid]){
f[mid]=ma;
}
abc(l,mid-1,x,p);
abc(mid+1,r,p,y);
return ;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
sq[i]=sqrt(i);
}
abc(1,n,1,n);
for(int i=1;i<=n/2;i++){
swap(a[i],a[n-i+1]);
swap(f[i],f[n-i+1]);
}
abc(1,n,1,n);
for(int i=1;i<=n/2;i++){
swap(a[i],a[n-i+1]);
swap(f[i],f[n-i+1]);
}
for(int i=1;i<=n;i++){
cout<<(long long)ceil(f[i])-(long long)a[i]<<endl;
}
return 0;
}

浙公网安备 33010602011771号