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

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

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

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

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

张煊作为金箍棒的主人,可以对金箍棒施以任意的变换,每次变换操作就是将一段连续的金属棒(从X到Y编号)改为铜棒,银棒或金棒。

金箍棒的总价值计算为N个金属棒的价值总和。其中,每个铜棒价值为1;每个银棒价值为2;每个金棒价值为3。

现在,张煊想知道多次执行操作后的金箍棒总价值。

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

对于每组测试数据,第一行包含一个整数N(1 <= N <= 100000),表示金箍棒有N节金属组成,第二行包含一个整数Q(0 <= Q <= 100,000),表示执行变换的操作次数。

接下来的Q行,每行包含三个整数X,Y,Z(1 <= X <= Y <= N,1 <= Z <= 3),它定义了一个操作:将从X到Y编号的金属棒变换为金属种类Z,其中Z = 1代表铜棒,Z = 2代表银棒,Z = 3代表金棒。

Output
对于每组测试数据,请输出一个数字,表示操作后金箍棒的总价值。

每组数据输出一行。


输入样例

1
10
2
1 5 2
5 9 3

输出样例

24

注意此时的lazy标记意为下推点的val值
附ac代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=4e5+10;
struct tr{
    int val;
    int lazy;
}t[N];
void pushup(int rt)
{
    t[rt].val=t[rt<<1].val+t[rt<<1|1].val;
}
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);
}
void pushdown(int rt,int ll,int rl)
{
    if(t[rt].lazy)
    {
        t[rt<<1].lazy=t[rt].lazy;
        t[rt<<1|1].lazy=t[rt].lazy;
        t[rt<<1].val=t[rt].lazy*ll;
        t[rt<<1|1].val=t[rt].lazy*rl;
        t[rt].lazy=0;
    }
}
void Update(int L,int R,int c,int l,int r,int rt)
{
    if(L<=l&&R>=r)
    {
        t[rt].val=c*(r-l+1);
        t[rt].lazy=c;
        return ;
    }
    int m=(l+r)>>1;
    pushdown(rt,m-l+1,r-m);
    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);
}
int Query(int L,int R,int l,int r,int rt)
{
    if(L>r||R<l) 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;
    int x,y,z;
    scanf("%d",&p);
    while(p--)
    {
        scanf("%d%d",&n,&m);
        memset(t,0,sizeof(t));
        build(1,n,1);
        while(m--)
        {
            scanf("%d%d%d",&x,&y,&z);
            Update(x,y,z,1,n,1);
        }
        printf("%d\n",Query(1,n,1,n,1));
    }
    return 0;
}

 

 

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

相关文章

  • hdu:张煊的金箍棒(3)(线段树)
    ProblemDescription张煊的金箍棒升级了!升级后的金箍棒是由N段相同长度的金属棒连接而成(最开始每段金属棒的价值都是1,从1到N编号);张煊作为金箍棒的主人,可以对金箍棒任意......
  • 【学习笔记 / 数据结构】线段树进阶
    扫描线【洛谷模板题传送门】思想以一条法线从下往上扫描整个图形,图形面积并即为\(\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输入包含多组测试用例,每组用例由两行组成:第一行......