首页 > 其他分享 >hdu:张煊的金箍棒(3)(线段树)

hdu:张煊的金箍棒(3)(线段树)

时间:2023-01-08 20:44:44浏览次数:44  
标签:rt hdu return val 张煊 线段 金箍棒 int

Problem Description
张煊的金箍棒升级了!

升级后的金箍棒是由N段相同长度的金属棒连接而成(最开始每段金属棒的价值都是1,从1到N编号);

张煊作为金箍棒的主人,可以对金箍棒任意一段施展魔法操作,每次操作就是将一段连续的金属棒(从X到Y编号)每一段都增加价值Z(Z为1,2,3三种)。

现在,张煊想知道执行M次操作后某一段金箍棒总值。

有Q次查询,每次询问一段(A到B)金箍棒的价值和。

Input
输入的第一行是测试数据的组数(不超过10个)。

对于每组测试数据,第一行包含一个整数N(1 <= N <= 100000),表示金箍棒有N节组成,第二行包含两个整数M(0 <= M <= 100,000)和 Q(1 <= Q <= 100),分别表示执行M次魔法操作,有Q次查询。

接下来的M行,每行包含三个整数X,Y,Z(1 <= X <= Y <= N,1 <= Z <= 3),它定义了一个操作:将从X到Y编号的金属棒每一段的价值增加Z,其中 Z = 1或者 Z = 2 或者 Z = 3。

接下来的Q行,每行包含二个整数A和B(1 <= A <= B <= N),表示查询从A到B这一段金箍棒的价值总和。

Output
对于每组测试数据,请输出Q行,每行一个数字,表示一次查询的结果。


输入样例

1
10
2 2
1 5 2
5 9 3
1 4
3 6
 

输出样例

12
16

基础的线段树应用,注意各个函数的用处和二分的写法
附ac代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
struct tr {
    LL val;
    LL lazy;
}t[4 * N];
void Pushup(int rt)
{
    t[rt].val = t[rt << 1].val + t[rt << 1 | 1].val;
}
void Pushdown(int rt, int ll, int rl)
{
    if (t[rt].lazy)
    {
        t[rt << 1].val += t[rt].lazy * ll;
        t[rt << 1 | 1].val += t[rt].lazy * rl;
        //注意lazy是+=
        t[rt << 1].lazy += t[rt].lazy;
        t[rt << 1 | 1].lazy += t[rt].lazy;
        t[rt].lazy = 0;
    }
}
void Build(int l, int r, int rt)
{
    if (l == r)
    {
        t[rt].val = 1;
        return;
    }
    int m = (l + r) >> 1;
    Build(l, m, rt << 1);
    Build(m + 1, r, rt << 1 | 1);
    Pushup(rt);
    //Pushup()的意义:建立好左右子树后合并到根节点
}
void Update(int L, int R, int c, int l, int r, int rt)
{
    if (L <= l && R >= r)
    {
        t[rt].val += (r - l + 1) * c;
        t[rt].lazy += c;
        return;
    }
    int m = (l + r) >> 1;
    Pushdown(rt, m - l + 1, r - m);
    //每次更新前将rt点下推至左右子节点
    if (L <= m) Update(L, R, c, l, m, rt << 1);
    if (R > m) Update(L, R, c, m + 1, r, rt << 1 | 1);
    Pushup(rt);
    //更新完左右子树再更新根节点
}
LL Query(int L, int R, int l, int r, int rt)
{
    if (r<L || l>R) return 0;
    if (L <= l && R >= r) return t[rt].val;
    int m = (l + r) >> 1;
    Pushdown(rt, m - l + 1, r - m);
    //每次查询子树前下推一次
    return Query(L, R, l, m, rt<<1) + Query(L, R, m + 1, r, rt<<1|1);
}
int main()
{
    int p, n, m, q;
    int x, y, z;
    scanf("%d", &p);
    while (p--)
    {
        scanf("%d%d%d", &n, &m, &q);
        memset(t, 0, sizeof(t));//清空t数组
        Build(1, n, 1);
        while (m--)
        {
            scanf("%d%d%d", &x, &y, &z);
            Update(x, y, z, 1, n, 1);
        }
        while (q--)
        {
            scanf("%d%d", &x, &y);
            printf("%lld\n", Query(x, y, 1, n, 1));
        }
    }
    return 0;
}

 

 

标签:rt,hdu,return,val,张煊,线段,金箍棒,int
From: https://www.cnblogs.com/ruoye123456/p/17035303.html

相关文章

  • 【学习笔记 / 数据结构】线段树进阶
    扫描线【洛谷模板题传送门】思想以一条法线从下往上扫描整个图形,图形面积并即为\(\sum\limits_{i=1}^{n-1}len_i\times\left(h_{i+1}-h_i\right)\),其中\(len_i\)......
  • 【Unity TIL】6. 如何判断两条线段是否相交
    AABB碰撞检测,也就是轴对齐碰撞检测,用平行于x,y轴的矩形表示物体。如何判断两个矩形是否相撞,可以通过分别判断x,y轴上的线段是否相交。假设线段分别为(s1,e1),(s2,e2),判......
  • 线段树
    概述线段树通过在原数组上建一棵二叉树,高效地处理各种结合性问题。线段树的生命就在于pushup和pushdown,更具体地,就在于结合性和差分性。操作线段树什么都支......
  • 吉老师线段树
    概述所谓吉老师线段树,指的其实是吉如一发明/整理的线段树上区间最值操作和区间历史最值的维护方式。操作区间最值操作\(\foralli\in[l,r],a_i=\min/\max(a_i,v)\)......
  • 某个被洛谷 ban 掉的吉老师线段树
    概述所谓吉老师线段树,指的其实是吉如一发明/整理的线段树上区间最值操作和区间历史最值的维护方式。操作区间最值操作\(\foralli\in[l,r],a_i=\min/\max(a_i,v)\)......
  • hdu:Choose the best route(dijstra,虚设点)
    ProblemDescriptionOneday,Kikiwantstovisitoneofherfriends.Assheisliabletocarsickness,shewantstoarriveatherfriend’shomeassoonasp......
  • hdu:最短路(堆优化的dijkstra)
    ProblemDescription在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现......
  • hdu: 张煊的金箍棒(3)(树状数组的区间修改,区间查询)
    ProblemDescription张煊的金箍棒升级了!升级后的金箍棒是由N段相同长度的金属棒连接而成(最开始每段金属棒的价值都是1,从1到N编号);张煊作为金箍棒的主人,可以对金箍棒任意......
  • hdu:sort it(逆序对,离散化)
    ProblemDescription给定n(n<=100000)个正整数,希望对其从小到大排序,如果采用冒泡排序算法,请计算需要进行的交换次数。Input输入包含多组测试用例,每组用例由两行组成:第一行......
  • 算法竞赛进阶指南 0x43 线段树
    文章目录​​线段树简介​​​​线段树的简单代码实现​​​​建树代码​​​​修改操作​​​​查询操作​​​​线段树的查询操作的时间复杂度分析:​​​​[AcWing245.你......