kb-07线段树-05-区间整体修改查询;(水)

 1 /*
 2
 3
 4  */
 5 #include<iostream>
 6 #include<cstring>
 7 #include<cstdio>
 8 using namespace std;
 9 struct P
10 {
11     int l,r,value;
12     int add;
13 }tr[400005];
14 void Pushup(int rt)
15 {
16     tr[rt].value=tr[rt<<1].value+tr[rt<<1|1].value;
17 }
18 void build(int rt,int l,int r)
19 {
20     tr[rt].l=l;
21     tr[rt].r=r;
22     tr[rt].add=0;
23     if(l==r)
24     {
25         tr[rt].value=1;
26         return ;
27     }
28     int mid=(l+r)/2;
29     build(rt<<1,l,mid);
30     build(rt<<1|1,mid+1,r);
31     Pushup(rt);
32 }
33 /*
34    区间修改,整体改成一个数,所以只需要记录这个数就可以了,区间的和可以用这个数乘以区间长度来求;
35  */
36 void Pushdown(int rt)
37 {
38     if(tr[rt].add<=0)
39         return ;
40     tr[rt<<1].value=tr[rt].add*(tr[rt<<1].r-tr[rt<<1].l+1);
41     tr[rt<<1|1].value=tr[rt].add*(tr[rt<<1|1].r-tr[rt<<1|1].l+1);
42     tr[rt<<1].add=tr[rt].add;
43     tr[rt<<1|1].add=tr[rt].add;
44     tr[rt].add=0;
45 }
46 void Update(int rt,int l,int r,int begin,int end,int x)
47 {
48     if(begin<=l&&end>=r)
49     {
50         tr[rt].add=x;
51         tr[rt].value=x*(r-l+1);//把区间更新成x
52         return ;
53     }
54     Pushdown(rt);
55     if(begin <=tr[rt<<1].r)
56     {
57         Update(rt<<1,l,tr[rt<<1].r,begin,end,x);
58     }
59     if(end >=tr[rt<<1|1].l)
60     {
61         Update(rt<<1|1,tr[rt<<1|1].l,r,begin,end,x);
62     }
63     Pushup(rt);//区间下面的值发生变化,所以要pushup
64
65 }
66 int main()
67 {
68     int T,k=1;
69     scanf("%d",&T);
70     while(T--)
71     {
72         int n,q;
73         scanf("%d%d",&n,&q);
74         memset(tr,0,sizeof(tr));
75         build(1,1,n);
76         for(int i=0;i<q;i++)
77         {
78             int ll,rr,v;
79             scanf("%d%d%d",&ll,&rr,&v);
80             Update(1,1,n,ll,rr,v);
81 //            for(int j=1;j<=25;j++)
82 //                printf("%d:%d\n",j,tr[j].value);
83         }
84         int ans=tr[1].value;
85         printf("Case %d: The total value of the hook is %d.\n",k++,ans);
86     }
87     return 0;
88 }
时间: 2024-11-05 13:43:04

kb-07线段树-05-区间整体修改查询;(水)的相关文章

HDU 1698 Dota钩子问题-线段树-(区间替换,查询总和)

题意:一段挂钩分成n段,每一段可以由铜.银.金做成,对应的价值分别是1,2,3,现在有m个操作(a,b,x)意思是改变区间[a,b]段的钩子为材质x,问m个操作之后这段挂钩的价值总和.挂钩的每一段初始为铜,也就是1. 分析: 区间更新,单点查询.确切的说是区间替换,询问总区间总和.线段树的典型应用之一.因为是区间更新,所以用 lazy[rt] 数组记录当前子树是否曾经更新过,lazy[rt]!=-1表示在本操作之前就已经替换过rt代表的子区间的值,那么需要把上次的更新操作向下执行完.详见注释.

CodeForces - 816B Karen and Coffee (线段树的区间插入+单点查询)

To stay woke and attentive during classes, Karen needs some coffee! Karen, a coffee aficionado, wants to know the optimal temperature for brewing the perfect cup of coffee. Indeed, she has spent some time reading several recipe books, including the u

【线段树求区间第一个不大于val的值】Lpl and Energy-saving Lamps

https://nanti.jisuanke.com/t/30996 线段树维护区间最小值,查询的时候优先向左走,如果左边已经找到了,就不用再往右了. 一个房间装满则把权值标记为INF,模拟一遍,注意考虑一个月内装满多个房间和装满所有房间后不用再购买的情况. 代码: #include <iostream> #include <cstdio> #include <algorithm> const int maxn = 100005; const int INF = 0x3

hihoCode 1078 : 线段树的区间修改

#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问——小Hi给出一段

hiho一下20周 线段树的区间修改

线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格--小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问--小Hi给出一段区间[L, R]

线段树的区间修改

线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格--小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问--小Hi给出一段区间[L, R]

hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问——小Hi给出一段

poj 3468:A Simple Problem with Integers(线段树,区间修改求和)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 58269   Accepted: 17753 Case Time Limit: 2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of

模板 线段树的区间修改

线段树的区间修改 区间绝对标记 改成同一个数 注意打标记前 要先判断 是否有标记 这道题不能像加法标记一样 标记初始化为 0 如果这道题 可以将数变成 0 那么0 就不能为初始值了 然后我们初始值要选择一个不会被干扰到的数字 比如 -1 就不会变成 -1 另外还要注意在标记清空时 要将标记 变成 -1 而不是 0 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstr