首页 > 其他分享 >4878. 维护数组

4878. 维护数组

时间:2023-03-25 21:12:01浏览次数:59  
标签:int tr 4878 sum1 pos 数组 维护 sum2 minv

维护数组

分析:

分别维护两个值sum1, sum2,其他套线段树板子

实现:

struct Node
{
    int l, r;
    int minv;
    int sum1, sum2;
} tr[N << 2];
void pushup(Node &u, Node &l, Node &r)
{
    u.minv = min(l.minv, r.minv);
    u.sum1 = l.sum1 + r.sum1, u.sum2 = l.sum2 + r.sum2;
}
void pushup(int u)
{
    pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}
void build(int u, int l, int r)
{
    if (l == r)
        tr[u] = {l, l, 0, 0, 0};
    else
    {
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(Lson), build(Rson);
        pushup(u);
    }
}
void modify(int u, int pos, int k)
{
    if (tr[u].l == pos && tr[u].r == pos)
    {
        tr[u].minv += k;
        tr[u].sum1 = min(tr[u].minv, b);
        tr[u].sum2 = min(tr[u].minv, a);
    }
    else
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if (pos <= mid)
            modify(u << 1, pos, k);
        else
            modify(u << 1 | 1, pos, k);
        pushup(u);
    }
}
int query(int u, int l, int r, int flag)
{
    if (tr[u].l >= l && tr[u].r <= r)
    {
        if (flag == 1)
            return tr[u].sum2;
        else
            return tr[u].sum1;
    }
    else
    {
        int mid = tr[u].l + tr[u].r >> 1;
        int res = 0;
        if (l <= mid)
            res = query(u << 1, l, r, flag);
        if (r > mid)
            res += query(u << 1 | 1, l, r, flag);
        return res;
    }
}
void solve()
{
    cin >> n >> k >> a >> b >> q;
    build(1, 1, n);
    while (q--)
    {
        int op, x, y, p;
        cin >> op;
        if (op == 1)
        {
            cin >> x >> y;
            modify(1, x, y);
        }
        else
        {
            cin >> p;
            cout << query(1, 1, p - 1, 2) + query(1, p + k, n, 1) << endl;
        }
    }
}

标签:int,tr,4878,sum1,pos,数组,维护,sum2,minv
From: https://www.cnblogs.com/Aidan347/p/17255588.html

相关文章

  • 数组指针
    一、概念下面哪个是数组指针?int*p1[10];int(*p1)[10];int(*p)[10];解释:p先和*结合,说明p是一个指针变量,然后指向一个大小为10的整型数组,所以p是一个指针,指向整型数组,叫做......
  • js 数组与对象的区别
    js数组与对象的区别 学习javascript的时候,我曾经一度搞不清楚”数组”(array)和”对象”(object)的根本区别在哪里,两者都可以用来表示数据的集合。 比如有一个数......
  • 由“交卷”功能引发的思考——对比两个字符串数组的差异
    最近在做一个答题系统,在交卷的时候需要判断客观题的答题情况客观题的题型有单选题、多选题、判断题其中判断题可以当做单选题处理,而单选题也可以当做标准答案长度为一的......
  • PHP二维数组排序|PHP二维数组去重
    二维数组排序functionarray_sort($arr,$keys,$order=0){ if(!is_array($arr)){ returnfalse; } $keysvalue=array(); foreach($arras$key=>$val){......
  • hdu-4630(树状数组)
    题目:Lifeisagame,andyouloseit,soyousuicide.Butyoucannotkillyourselfbeforeyousolvethisproblem:Givenyouasequenceofnumbera1,a2,...,an.T......
  • 数组模拟双向列表 洛谷 P1160 队列安排
    题目描述一个学校里老师要将班上N个同学排成一列,同学被编号为1~N,他采取如下的方法:1.先将1号同学安排进队列,这时队列中只有他一个人;2.2~N号同学依次入列,编号为i的同学入列方式......
  • 数组
    目录1.数组概念:2.数组的定义格式一:格式二:详解:注意点:3.数组的静态初始化完整格式:格式详解:注意点:简化格式:练习1:练习2:练习3:4.地址值5.数组元素访问格式:作用:代码示例:6.索引索......
  • go的环形数组
    packagemainimport( "errors" "fmt" "os")//使用一个结构体管理环形队列typeCircleQueuestruct{ maxSizeint//4 array[5]int//数组 head......
  • php:用数组实现多语言(PHP 7.4.2)
    一,适用的场景:   旧系统需要增加多语言,不想改变原有的运行环境,   所以没有使用gettext,选择简单的用数组来实现说明:刘宏缔的架构森林是一个专注架构的博客,地......
  • openGauss维护管理之set自定义变量
    一、概述1、在mysql中,经常会有如下用法set@var_name:=123;2、在openGauss中,该语法默认没有打开,需要先修改一个环境变量报错:"onlysupportwhiledbcompabilityisB......