【题解】线段树·关于时间

区间多目标优化算法IP-MOEA 区间多目标进化算法IP-MOEA 阅读详情

题目链接

这是本蒟蒻的原创题
确实很简单
本蒟蒻LOJ账号Diogenes

本题的难点在于每个操作会重复多次。核心思想是把第t秒的操作提前到第一秒,再减去多余的部分。有一种构造方法: Add[i..j] A d d [ i . . j ] 表示区间 【i,j】 【 i , j 】 需要加的值。
Del[i..j] D e l [ i . . j ] 表示区间 【i,j】 【 i , j 】 统计答案时需要减去的值。
假设时间 t t 给区间[L,R]加上 x x ,应当给Add[L..R]每个加上 x x ,给Del[L..R]每个加上x∗(t−1)
假设时间t求区间 [L,R] [ L , R ] 的和,就计算 Add[L..R]∗t−Del[L..R] A d d [ L . . R ] ∗ t − D e l [ L . . R ]
用线段树维护区间加,区间和。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
#define ll long long
using namespace std;

inline int getint()
{
    char ch;
    int p=0,t;
    for(ch=getchar();ch!='-' && !isdigit(ch);ch=getchar());
    if(ch=='-'){
        t=-1;
    }
    else{
        t=1;
    }
    for(;!isdigit(ch);ch=getchar());
    for(;isdigit(ch);ch=getchar()){
        p=p*10+ch-48;
    }
    return t*p;
}

inline long long getLL()
{
    char ch;
    long long p=0,t;
    for(ch=getchar();ch!='-' && !isdigit(ch);ch=getchar());
    if(ch=='-'){
        t=-1;
    }
    else{
        t=1;
    }
    for(;!isdigit(ch);ch=getchar());
    for(;isdigit(ch);ch=getchar()){
        p=p*10+ch-48;
    }
    return t*p;
}

struct seqTree{
#define lc (o<<1)
#define rc ((o<<1)|1)
#define MID ((L+R)>>1)
#define ll long long
    int n;
    vector<ll> addv;
    vector<ll> sumv;
    vector<ll> A;
    void treeClear(){
        addv.clear();
        sumv.clear();
        A.clear();
    }

    void treeResize(int n){
        addv.resize(n<<2);
        sumv.resize(n<<2);
    }

    seqTree():n(0){
        treeClear();
    }

    seqTree(int n):n(n),A(n+2),addv(n<<2),sumv(n<<2){}

    void maintain(int o,int L,int R)
    {
        if(L==R){
            sumv[o]=A[L];
        }
        if(R>L){
            sumv[o]=sumv[lc]+sumv[rc];
        }
    }

    void dfsBuild(int o,int L,int R)
    {
        if(L==R){
            sumv[o]=A[L];
        }
        if(L<R){
            if(MID>=L) dfsBuild(lc,L,MID);
            if(MID<R) dfsBuild(rc,MID+1,R);
            maintain(o,L,R);
        }
    }

    void build(vector<ll> X,unsigned int L,unsigned int R)
    {
        if(X.empty()) return;
        R=min(R,(unsigned int)X.size());
        L=max(L,(unsigned int)0);
        treeClear();
        A.push_back(0);
        for(unsigned int i=L;i<R;i++){
            A.push_back(X[i]);
        }
        n=A.size()-1;
        treeResize(n);
        dfsBuild(1,1,A.size()-1);
    }

    seqTree(vector<ll> A)
    {
        build(A,0,A.size());
    }

    void updata(int o,int L,int R,int y1,int y2,ll v){
        if(y1<=L && y2>=R){
            addv[o]+=v;
            sumv[o]+=v*(R-L+1);
        }
        else{
            pushDown(o,L,R);
            if(y1<=MID) updata(lc,L,MID,y1,y2,v);
            if(y2>MID) updata(rc,MID+1,R,y1,y2,v);
            maintain(o,L,R);
        }
    }

    void pushDown(int o,int L,int R)
    {
        if(addv[o]!=0){
            addv[lc]+=addv[o];
            addv[rc]+=addv[o];
            sumv[lc]+=addv[o]*(MID-L+1);
            sumv[rc]+=addv[o]*(R-MID);
            addv[o]=0;
        }
    }

    ll getSum(int o,int L,int R,int y1,int y2)
    {
        if(y1<=L && y2>=R){
            return sumv[o];
        }
        pushDown(o,L,R);
        ll ret=0;
        if(y1<=MID) ret+=getSum(lc,L,MID,y1,y2);
        if(y2> MID) ret+=getSum(rc,MID+1,R,y1,y2);
        return ret;
    }
};

struct Node{
    ll a,b,c;
    Node():a(0),b(0),c(0){}
    Node(ll a,ll b,ll c):a(a),b(b),c(c){}
};

int n,m;
seqTree del;

int main()
{
    scanf("%d",&n);
    vector<long long> k,k2(n+1);
    k2[0]=0;
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        k.push_back(0);
        k2[i]=k2[i-1]+a;
    }
    seqTree sum(k),del(k);
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        int D,a,b;long long c;
        scanf("%d",&D);
        if(D==1){
            a=getint();
            b=getint();
            c=getLL();
            sum.updata(1,1,n,a,b,c);
            del.updata(1,1,n,a,b,c*i);
        }
        if(D==2){
            a=getint();
            b=getint();
            printf("%lld\n",sum.getSum(1,1,n,a,b)*i+k2[b]-k2[a-1]-del.getSum(1,1,n,a,b));
        }
    }
    return 0;
}

LOJ的dalao也给出了树状数组解法

区间优化工具以及程序 区间优化工具以及程序,INTLAB完全是用Matlab编写的.自我验证方法 密集的线性系统(也包括内部包含和结构化矩阵) 稀疏的spd线性系统 非线性方程组 几个全球性例程: 非线性方程组的所有根 验证了全局优化 验证约束全局优化 参数识别 单变量和多变量非线性方程的根(简单和集群) 特征值问题(简单和集群,也包含内部包含和结构化矩阵) 广义特征值问题(简单和集群) 正交用于单变量函数 单变量多项式零(简单和群集) 前向和后向FFT 包含向量和矩阵的实数和复数数据的区间算法(非常快) 实数和复数稀疏矩阵的区间算法(非常快) 仿射算法包括向量和矩阵 渐变使用仿射算法 Hessians使用仿射算术 泰勒扩展使用仿射算法 fl-numbers:k位浮点和区间运算 自动微分(正向模式,矢量化计算,快速) 梯度(解决非线性方程组) Hessians(用于全球优化) 泰勒系列的单变量函数 自动斜率(顺序方法,对于很多变量很慢) 验证(简单)单变量函数的集成 单变量和多变量(区间)多项式 严格的实时间隔标准函数,包括gamma,erf和erfc(快速,非常准确,〜3 ulps) 严格的复杂间隔标准功能(快速,严谨,但不一定是尖锐的内含物) 一些严格的更高的先验功能 严格的输入/输出(外部和内部包含) 精确求和,点积和矩阵向量残差(解释,参考实现,慢) 几个实用程序 具有误差范围的多精度区间算术(作业慢,速度慢) 立即下载

相关推荐

区间优化理论

区间优化概述,和工程问题的实例,对于区间优化的推广有重要意义

Matlab如何实现区间优化

很久没有写博客了,距离上次写也是两年前了,最近开始在做优化方面的内容,今天想就matlab如何实现区间优化的方法记录一下。 对于优化算法的实现,很大一部分同学采用Lingo软件来进行实现,但是为了论文和作图的需求,采用matlab的方法是不二之选。 1.认识优化函数linprog 首先,让我们先认识一下linprog函数。matlab说明文档是这样介绍的: 改函数用于求解线性规划问题,而我们所用到...

流浪若相惜的专栏 6735

【理解机器学习算法】之Clustering算法(Agglomerative Clustering)

是一种层次聚类算法,通过逐步合并或“聚集”它们来构建嵌套聚类。这种方法采用自底向上的方式构建聚类层次:它从将每个数据点作为单个聚类开始,然后迭代合并最接近的聚类对,直到所有数据点合并为一个聚类,或直到达到指定的聚类数量。优点:- 聚合聚类在距离和连接准则的选择上具有多样性,使其适用于各种数据集。- 它产生了一个层次结构,这对于不同规模的聚类数据结构是有信息量的。-缺点:- 对于大数据集来说,它可能计算成本高,因为它需要在每次迭代中计算和更新所有聚类对之间的距离。

Hyman Qiu 2688

“区间优化:贪心算法在区间问题中的应用“

给定 𝑁 个闭区间 [𝑎𝑖,𝑏𝑖],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。

Rockivy的博客 2143

风力发电机并网模型建立及仿真验证

传统能源日益匮乏,环境污染日趋严重,全球向安全、可靠和环保的可持续能源体系转型迫在眉睫,风电迎来了重要的发展契机。近年来,全球风电迅猛发展,我国已成为世界风电新增装机容量第一的国家。然而,随着风电规模的不断增大,风电场接入对系统影响不容忽视。随着变速恒频风力发电系统优越的性能突出和大容量电力电子技术的成熟,风速随机性引起的功率波动及故障情况下的动态响应,对电能质量,系统电压、频率的稳定性产生的影响需要深入研究。因而,本文结合实际项目,针对变速恒频风力发电系统建模,端口动态特性及对电网电能质量、运行稳定性的影

毕业设计区博客 1637

ZYNQ平台上基于SGMII接口的IEEE1588/PTP协议高效实现方案

本文深入探讨了在Xilinx ZYNQ平台上,利用SGMII接口实现高精度IEEE1588/PTP协议的方案。通过将硬件时间戳单元集成在PL端的AXI以太网子系统IP核中,该方案绕过了软件协议栈和外部PHY的延迟,实现了亚微秒级的时间同步精度。文章详细解析了硬件设计、Vivado IP配置、Linux驱动移植及PTP协议栈部署等关键步骤,为工业控制、通信等领域的高精度网络同步提供了高效、灵活的解决路径。

q5r6s7的博客 604

时间线段树(又称全局线段树)

其实这个算法就是这个名字,用时间节点来建一颗线段树,当然得要求离线操作,强制在线的话一般而言用不了这个方法(当然更大的可能是我没想到)。 这个算法其实不难,只是我学了很久罢了。 首先引入问题,比如要你维护一个并查集块的数目,多次修改边与边之间的关系,每次修改完后问你连通块的数目,路径压缩的并查集显然无法进行删除的操作。 所以就得学习时间线段树,每次操作边时为一个时间节点,建立线段树,我们可以很轻易的知道每条边所存在的时间段,比如第二次操作被添加,第五次操作被删除,2-4就是这条边存在的时间节点,而区间

permi_yaxileni的博客 977

IEDA激活码失效?教你5分钟快速续期的方法

本文针对IEDA激活码失效问题,提供了一套从快速应急到深度排查的完整解决方案。文章不仅详解了5分钟快速续期与清理缓存等应急方法,更深入剖析了授权机制、离线激活流程,并指导如何构建可持续的授权管理策略,帮助开发者彻底解决激活困扰,确保开发环境稳定。

a0b1c2d3的专栏 273

区间多目标优化算法IP-MOEA研究(Matlab代码实现)

初始化:生成一个初始种群,种群中的每一个个体不仅代表了一个潜在的解,而且还包含了解的不确定性(即区间值)。适应度评估:对于每一个个体,根据其性能和不确定性范围进行适应度评估。这一步骤需要特殊的适应度评估函数,能够同时考虑目标优化性能和不确定性。选择:根据个体的适应度,采用一种基于区间Pareto支配的选择机制,选择出表现较好的个体进行繁殖。在这个过程中,不仅比较个体间目标函数的性能,还比较其不确定性的大小,以此来判断哪些个体更有可能成为Pareto最优解。交叉和变异。

weixin_67304359的博客 1092

静止无功补偿SVG的基本控制原理

上图是自励单变量控制框图,基本控制方式为,采集计算得到负载无功电流和SVG输出的无功电流的差值,经过PI调节作为功率角δ和固定的调制深度λ和调制波,经过PWM调制形成开关信号驱动SVG的功率电路。该控制方式使保持调制深度λ(即SVG电压的幅度)不变,通过调整δ来调整直流电压和无功,跟踪输出无功功率,直流电压就会大幅度随动,无功相应速度较慢。SVG通常有他励方式和自励方式,他励方式需要提供外部的直流电源,自励方式通过电网输出有功功率至SVG建立SVG的直流电压。δ为Us和Uc之间的相角差。

weixin_42668920的博客 1987

auboi5 + d435i 使用easy handeye进行标定时,遇到相关问题记录。

解决办法:在easy_handeye默认的 calibrate.launch 文件中move group 的默认值为 "manipulator",但针对每个人的机械臂,这个值需要更改。以aubo_i5为例,需要将其改为"manipulator_i5",或者自己编写launch文件时,传入参数move group的值,便能顺利解决问题!easy_handeye_calibration_server 进程出现崩溃。

weixin_61025092的博客 958

const iterator 和 const_iterator的区别

清晰明了 const iterator 和 const_iterator的区别

shylyly_的博客 906

AquaCrop-OSPy学习笔记02:模型输入设置

AquaCrop-OSPy的输入设置

EWBA_GIS_RS_ER的博客 3692

C++中define、typedef、inline、const和constexpr的区别

constexpr 只能定义编译期常量,⽽ const 可以定义编译期常量,也可以定义运⾏期常量。相较于const,constexpr 可以用于数组大小、模板参数等要求编译期确定的场景。// 运行时和编译期皆可用// 仅编译期可用// 可能编译错误(如果 x 不是编译期常量)// 编译成功C++ 中更推荐使用 const 或 constexpr 替代常量宏,使用 inline或constexpr 替代宏函数。

qq_45927005的博客 1717

一文读懂AUTOSAR CAN通信

在AUTOSAR的分层和模块化架构中,使用PduR(Protocal Data Unit Router)将总线或者网络数据进行抽象,使得上层应用不用关心信号的来源。本文从PduR下层的CAN Interface、CAN Driver和CAN Transceiver Driver模块介绍CAN总线在AUTOSAR架构中的工作机制以及信号的收发等功能。PduR以及COM等上层模块的介绍可以参考公众号内发布的历史文章。

酒无忧的博客 2493

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

指针、const 和 typedef

一、const int* p 和 int* const p         const int* p;          p是指向int类型变量的指针,p所指向的变量为const类型。p指向的变量不能修改。 int* const p; p是指向int类型变量的指针,p为const类型。p的值不能修改,即p不能由指向变量A改为指向变量B。 二、const int* p和in

JakeMiao的专栏 1799

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Typedef、 Const、#define三者的区别和联系

修饰的是这个指针指向的内容不允许修改,这个指针的地址可以改变。错误:在c语言中n并不是真正意义上的常量,它还是变量 ,对于数组来说必须要开辟一个准确的数组大小,C++中是可以编译过去。修饰的指针,表示这个指针的地址不可以修改,地址的内容可以修改。//这样也是错误的,数组必须是确定的。是一样的都是修饰变量a为常量。//a是int * a, b是 int* b。//a是int * a, b是 int b。补充:int *p,q表示p是指针变量,q是int变量。

controlourself的博客 535

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C语言复习 —— const define typedef

1. const 关键字 2. define 宏定义 3. typedef的用法 3.1 typedef和const结合的陷阱 3.2 define和typedef的区别 3.3 typedef与结构体的练习

不善挽留 801

区间算术在人工智能算法中的优化

1.背景介绍 区间算术是一种在计算机科学和数学中广泛应用的技术,它主要关注于处理区间和集合的运算。在人工智能领域,区间算术在许多算法中发挥着重要作用,例如机器学习、数据挖掘、图像处理等。随着数据规模的不断增加,以及计算需求的不断提高,区间算术在人工智能算法中的优化成为了一个重要的研究方向。 在本文中,我们将从以下几个方面进行探讨: 背景介绍 核心概念与联系 核心算法原理和具体操作步骤以及数...

AI天才研究院 809

【算法】区间调度算法

本文介绍了区间调度算法的相关知识。

代码星辰的博客 1318

区间算术与机器学习的结合:优化算法的应用

1.背景介绍 区间算术和机器学习都是计算机科学领域的重要内容。区间算术主要关注于处理区间数值的计算和运算,而机器学习则涉及到人工智能领域,主要关注于模型的训练和优化。在实际应用中,区间算术和机器学习往往会相互结合,以提高算法的效率和准确性。本文将从以下几个方面进行阐述: 区间算术与机器学习的结合背景 区间算术与机器学习的核心概念与联系 区间算术与机器学习的核心算法原理和具体操作步骤以及数学模...

AI天才研究院 595

线段树:关于时间

题目链接:线段树:关于时间 我们以一个基准点建立一个增加的线段树,然后减去一个多余的线段树即可。 比如我们以1号为基准点,那么多余的要减去的是已知的,就是到1号节点的距离,然后增加的也就是当前查询的时候的编号。 AC代码: #pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+1

青烟绕指柔的博客 541

时间序列线段树

可以以O(log2(n))的时间复杂度处理任何日期序列的区间点修改和统计问题,例如维护区间和、区间内最大最小值平均数、区间内最大公因数、区间内的逆序数个数。以下为一个维护时间序列RMQ(区间最小值)的例子 <?php /** * Description: 时间序列线段树 * */ define("INFINITE", pow(2, 64)); class TSSegTree {

枯荣 1274

时间分治(线段树分治)

对于一类有插入、删除(撤销插入)和整体查询操作的题目,可以考虑按时间分治(也可以叫线段树分治),就是对于每一个插入操作处理出它存在的时间,那么就不用管删除操作了,再将这些插入操作存在区间建立一棵时间线段树,每个节点是一个vector,然后从线段树dfs到叶子经过的点上所有点vector的并就是在这个点时会对其产生影响的所有操作了。而一般这类题不会真的要把所有vector传到叶子,可能是线性基之类的...

caoyang1123的博客 1015

codeforces 1140 F(时间线段树)

题目链接:https://codeforc.es/contest/1140/problem/F 思路:时间线段树部分挺裸的,一个点能把行和列连接在一起,那么答案就是每个联通快里面行的个数乘上列的个数,把行和列看成点的思想好像挺常见的,网络流建图什么的也可以经常可以看见这种思想,纪录一下 #pragma GCC optimize(3) #include <unordered_map&gt...

llmxby 351
上一篇: OI常用网址链接
下一篇: Trie模板
Ansicht
博客等级 码龄9年 6粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值