P2003 [CRCI2007-2008] PLATFORME 平板(线段树)

题目传送门

平板

题目大意

一个空间中,给你n个板子,分别告知你每个板子的高度和水平的边缘坐标
上面的板子可以搭建在下面的板子上,如下图:
在这里插入图片描述
求所需的最小的支柱的长度

思路

因为数据小的原因可以采取 O ( n 2 ) O(n^2) O(n2)的简单做法,但因为学习线段树中,故给出线段树的解法

先以板子的高度进行排序,然后后面的板子必在高处,判断两端下方的位置是否有板子后修改即可
即为单点查询,区间修改

在处理边界时,发现容易误判,采取大佬的想法:
查[l,l+1] 与 [r-1,r]时,这就会使边界相交的板子误判可插钉,事实上差0.5个单位长度
我们此题的(l,r)是开区间,我的线段树是闭区间,那么可以令我区间修改时,不修改[l,r] 而是修改[l+1,r-1] 这样就相当于开区间了。

AC Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e4+9;
struct node{
    int y, x1, x2;
}a[N];
struct segtree{
    int v, tag;
}tr[N<<2];
inline int read()
{
    int ans=0;
    char last=' ',ch=getchar();
    while(ch<'0'||ch>'9') last=ch,ch=getchar();
    while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar();
    if(last=='-') ans=-ans;
    return ans;
}
inline int lc(int p)   {return p<<1;}
inline int rc(int p)   {return p<<1|1;}
inline void build(int k, int l, int r){
    if(l==r)    return ;
    int mid=(l+r)>>1;
    build(lc(k), l, mid);
    build(rc(k), mid+1, r);
}
inline void f(int p, int k){
    tr[p].v=max(tr[p].v, k);
    tr[p].tag=max(tr[p].tag, k);
}
inline void push_down(int p){
    f(lc(p), tr[p].tag);
    f(rc(p), tr[p].tag);
    tr[p].tag=0;
}
inline void push_up(int p)  {tr[p].v=max(tr[lc(p)].v, tr[rc(p)].v);}
inline void updata(int p, int l, int r, int x, int y, int k){
    if(x>r || y<l)  return ;
    if(l<=x && y<=r){
        tr[p].v=max(tr[p].v, k);
        tr[p].tag=max(tr[p].tag,k);
        return ;
    }  
    int mid=(x+y)>>1;
    if(tr[p].tag) push_down(p);
    updata(lc(p), l, r, x, mid, k);
    updata(rc(p), l, r, mid+1, y, k);
    push_up(p);
}
inline int query(int p, int l, int r, int x, int y){
    if(x>r || y<l)  return 0;
    if(l<=x && y<=r) return tr[p].v;
    int mid=(x+y)>>1;
    if(tr[p].tag) push_down(p);
    return max(query(lc(p), l, r, x, mid), query(rc(p), l, r, mid+1, y));
}
inline bool cmp(node a, node b){
    return a.y<b.y;
}
int main(){
    int n=read();
    ll ans=0;
    for(int i=1; i<=n; i++){
        a[i].y=read();
        a[i].x1=read();
        a[i].x2=read();
    }
    sort(a+1, a+1+n, cmp);
    build(1,1,N);
    int h;
    for(int i=1; i<=n; i++){
        h=query(1,a[i].x1,a[i].x1+1, 1, N);
        ans+=(a[i].y-h);
        h=query(1,a[i].x2-1,a[i].x2, 1, N);
        ans+=(a[i].y-h);
        updata(1,a[i].x1+1, a[i].x2-1, 1, N, a[i].y);
    }
    cout<<ans<<endl;
    return 0;
}

内容概要:本文详细探讨了基于樽海鞘算法(SSA)优化的极限学习机(ELM)在回归预测任务中的应用,并与传统的BP神经网络、广义回归神经网络(GRNN)以及未优化的ELM进行了性能对比。首先介绍了ELM的基本原理,即通过随机生成输入层与隐藏层之间的连接权重及阈值,仅需计算输出权重即可快速完成训练。接着阐述了SSA的工作机制,利用樽海鞘群体觅食行为优化ELM的输入权重和隐藏层阈值,从而提高模型性能。随后分别给出了BP、GRNN、ELM和SSA-ELM的具体实现代码,并通过波士顿房价数据集和其他工业数据集验证了各模型的表现。结果显示,SSA-ELM在预测精度方面显著优于其他三种方法,尽管其训练时间较长,但在实际应用中仍具有明显优势。 适合人群:对机器学习尤其是回归预测感兴趣的科研人员和技术开发者,特别是那些希望深入了解ELM及其优化方法的人。 使用场景及目标:适用于需要高效、高精度回归预测的应用场景,如金融建模、工业数据分析等。主要目标是提供一种更为有效的回归预测解决方案,尤其是在处理大规模数据集时能够保持较高的预测精度。 其他说明:文中提供了详细的代码示例和性能对比图表,帮助读者更好地理解和复现实验结果。同时提醒使用者注意SSA参数的选择对模型性能的影响,建议进行参数敏感性分析以获得最佳效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值