poj_4047Garden区间更新_求和

本文介绍了一种使用线段树解决区间更新与查询问题的方法,特别关注于连续k个数的最大和查询。通过构建特殊的线段树,实现区间元素的修改与交换操作,并能高效地查询指定区间内的最大值。



/*  题意:
给出一个N个数的序列以及一个k(0<k<=n<=200000),m个操作p,x,y,其中
p=0:将x位置的数替换为y
p=1:将x y位置的数互换
p=2:  查询x-y位置区间连续k个数的和的最大值

    解析:求连续区间和最大,可以讲每个区间(我们取左端点)当做一个点,点的附加信息(线段树结子叶点的值)
就等于该区间的连续k个数最大值,可以分为1~k,2~k+1...n-k+1~n,一共从1到n-k+1个点构成线段树。
线段树中除了子叶结点,其他结点都保存的是子叶结点中的最大值。
当x位置值改变时,影响的范围为:
    注:我们都是以区间的左端点存入线段树;
    (1)假设x位置是某区间的右端点,则其左端点为x-k+1,但是最小端点是从1开始,
x-k+1可能小于1,因此要取这两者最大值;
    (2)假设x位置是某区间的左端点,再次说明下,我们是以区间的左端点代表该区间存入线段树,因此当x为左端点
时要与最大左端点n-k+1比较,取最小值;
    求出x位置影响范围后,更新区间[max(1,x-k+1),min(x,n-k+1)],找到更新结点后,回溯向上更新即Getmax函数,
当p==1时,区间最值变为_max=_max-v[x]+y;
当p==2时,相当于两次p==1的操作,_max=_max-v[x]+v[y],_max=_max-v[y]+v]x];
每次某位置值改变后,要在原数组中同时更改

    最后查询x到y位置区间最值时,我们是以区间左端点代表区间,在线段树中只需查询l=x,r=y-k+1即可

*/


#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define inf -0x3f3f3f3f
#define mem0(a) memset(a,0,sizeof(a))
const int maxn = 200000+10;
int sum;
int v[maxn],b[maxn];
struct node{
    int l,r,_max,lazy;
}a[maxn<<2];
void Getmax(int cur){
    a[cur]._max = max(a[cur<<1]._max,a[cur<<1|1]._max);
}
void build(int l,int r,int cur){
    a[cur].l = l;
    a[cur].r = r;
    a[cur].lazy = 0;
    int mid = (l + r )>>1;
    if(l == r){
        a[cur]._max = b[l];
        return ;
    }
    build(l,mid,cur<<1);
    build(mid+1,r,cur<<1|1);
    Getmax(cur);
}

void pushdown(int cur){
    if(a[cur].lazy){
        //设置左右孩子节点的标志域,因为孩子节点可能被多次延迟标记又没有向下传递 
        //所以是 “+=” 
        a[cur<<1].lazy += a[cur].lazy;
        a[cur<<1|1].lazy += a[cur].lazy;
        //根据标志域设置孩子节点的值。因为我们是求区间最大值,因此当区间内每个元 
        //素加上一个值时,区间的最大值也加上这个值
        a[cur<<1]._max += a[cur].lazy;
        a[cur<<1|1]._max += a[cur].lazy;
        a[cur].lazy = 0;//清除标记
    }
}

void update(int l,int r,int v,int cur){
    //当前节点区间包含在更新区间内
    if( l <= a[cur].l &&  r >= a[cur].r){
        a[cur]._max += v;
        a[cur].lazy += v;
        return ;
    }
    pushdown(cur); //延迟标记向下传递
    //更新左右孩子节点
    int mid = (a[cur].l + a[cur].r )>>1;
    if(r <= mid)
        update(l,r,v,cur<<1);
    else if(l > mid)
        update(l,r,v,cur<<1|1);
    else {
        update(l,mid,v,cur<<1);
        update(mid+1,r,v,cur<<1|1);
    }
    Getmax(cur);//根据左右子树的值回溯更新当前节点的值
}

int query(int l,int r,int cur){
    if( l <= a[cur].l   && r >= a[cur].r){
        return a[cur]._max;
    }//若等于要求的区间,则返回结点保存的最值
    pushdown(cur);//----延迟标志域向下传递
    int mid = (a[cur].l + a[cur].r )>>1;
    //分别从左右子树查询,返回两者查询结果的较大值
    if(r <= mid )
        return query(l,r,cur<<1);
    else if(l > mid)
        return query(l,r,cur<<1|1);
    else {
        return max(query(l,mid,cur<<1),query(mid+1,r,cur<<1|1));
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i = 1 ;i <= n ; i++)
            scanf("%d",&v[i]);
        mem0(b);
        for(int i = 1 ; i <= k ; i++)
            b[1]+=v[i];//第一段和,从1~k
        for(int i = 2 ; i <= n-k+1;i++)
            b[i]=b[i-1]-v[i-1]+v[i+k-1];
        //求剩下每k段和,2~k+1...n-k+1~n
        build(1,n-k+1,1);
        while(m--){
            int c,x,y;
            scanf("%d%d%d",&c,&x,&y);
            if(c==0){
                update(max(1,x-k+1),min(n-k+1,x),y-v[x],1);
                v[x]=y;
            }
            else if(c== 1){
                update(max(1,x-k+1),min(n-k+1,x),v[y]-v[x],1);
                update(max(1,y-k+1),min(n-k+1,y),v[x]-v[y],1);
                swap(v[x],v[y]);
            }
            else
                printf("%d\n",query(x,y-k+1,1));
        }
    }
    return 0;
}


【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最大间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度与位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C与核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法与机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值