社区讨论

李超树疑似被卡常80pts求助

P4655[CEOI 2017] Building Bridges参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mkqrspp4
此快照首次捕获于
2026/01/23 19:01
4 周前
此快照最后确认于
2026/01/24 09:36
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
const ll N=1e5+5;
ll n,tot,h[N],w[N],dp[N];
int rt,ls[N<<3],rs[N<<3];
struct Node{
	ll k,b;
	ll cal(ll x){return k*x+b;}
} t[N<<3];
void up(int &id,int l,int r,Node p){
	if(!id) return id=++tot,t[id]=p,void();
	if(p.cal(mid)>t[id].cal(mid)) swap(t[id],p);
	if(p.k>t[id].k) up(rs[id],mid+1,r,p);
	else up(ls[id],l,mid,p);
}
ll qry(int id,int l,int r,int x){
	if(!id) return -1e18;
	if(x<=mid) return max(t[id].cal(x),qry(ls[id],l,mid,x));
	return max(t[id].cal(x),qry(rs[id],mid+1,r,x));
}
int main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(ll i=1;i<=n;i++) cin>>h[i];
    for(ll i=1;i<=n;i++) cin>>w[i],w[i]+=w[i-1];
    dp[1]=0;
    for(ll i=2;i<=n;i++){
        dp[i]=1e18;up(rt,0,1e6,{2*h[i-1],-h[i-1]*h[i-1]+w[i-1]-dp[i-1]});
        dp[i]=w[i-1]+h[i]*h[i]-qry(rt,0,1e6,h[i]);
    }
    cout<<dp[n];
    return 0;
}
死活TLE on 17,18,不知道是什么问题,我记得 n=106n=10^6 李超都能过啊

回复

3 条回复,欢迎继续交流。

正在加载回复...