线段树 延迟更新

fafu 1008

 1 #include<stdio.h>
 2 #include<string.h>
 3 const int N=100000+5;
 4 int n, q;
 5 int a[N], tree[N<<2], t[N<<2];
 6
 7 void build(int rt, int l, int r)
 8 {
 9     if(l==r)
10         tree[rt]=10;
11     else
12     {
13         int m=(l+r)>>1;
14         build(rt<<1, l, m);
15         build((rt<<1)+1, m+1, r);
16
17         tree[rt]=tree[rt<<1]+tree[(rt<<1)+1];
18     }
19 }
20
21 void pushDown(int rt, int m)
22 {
23     if(t[rt]!=-1)
24     {
25         t[rt<<1]=t[rt];
26         t[(rt<<1)+1]=t[rt];
27         tree[rt<<1]=t[rt]*(m-(m>>1));
28         tree[(rt<<1)+1]=t[rt]*(m>>1);
29         t[rt]=-1;
30     }
31 }
32
33 void update(int rt, int l, int r, int x, int y, int v)
34 {
35     if(x<=l && r<=y)
36     {
37         t[rt]=v;
38         tree[rt]=(r-l+1)*v;
39         return;
40     }
41     pushDown(rt, r-l+1);
42     int m=(l+r)>>1;
43     if(x<=m)
44         update(rt<<1, l, m, x, y, v);
45     if(m<y)
46         update((rt<<1)+1, m+1, r, x, y, v);
47     tree[rt]=tree[rt<<1]+tree[(rt<<1)+1];
48 }
49
50 int main()
51 {
52     int T;
53     scanf("%d", &T);
54     for(int k=1; k<=T; k++)
55     {
56         scanf("%d%d", &n, &q);
57         int x, y, v;
58         build(1, 1, n);
59         memset(t, -1, sizeof(t));
60         for(int i=0; i<q; i++)
61         {
62             scanf("%d%d%d", &x, &y, &v);
63             int mi=x<y?x:y;
64             int ma=x>y?x:y;
65             update(1, 1, n, mi, ma, v);
66         }
67         printf("Case %d: The total value of the stick is %d.\n", k, tree[1]);
68     }
69     return 0;
70 }
时间: 2024-10-29 02:40:33

线段树 延迟更新的相关文章

hdu 5023 线段树延迟更新+状态压缩

/* 线段树延迟更新+状态压缩 */ #include<stdio.h> #define N 1100000 struct node { int x,y,yanchi,sum; }a[N*4]; int lower[31]; void build(int t,int x,int y) { a[t].x=x; a[t].y=y; a[t].yanchi=0; if(x==y){ a[t].sum=lower[1]; return ; } int temp=t<<1; int mid=

线段树延迟更新

title: 线段树延迟更新 date: 2018-10-10 18:50:49 tags: acm 算法 categories: ACM-线段树 概述 暑假集训的时候好多东西只学了个皮毛,,,对付模板题还能试试,,,但是一看一些稍难的一些题时,,,肯定单纯的套模板是不行得了,,,那样多没意思啊,,, 延迟更新之前就看到过,,,当初的映像就是在普通的线段树里加一个lazy,,,然后可以延迟更新区间,,,这在对区间整段的更新很有用,,,因为不用对更新区间的每一个点更新,,这样就能省下很多时间,,,

poj 2528 线段树+延迟更新

题目链接:http://poj.org/problem?id=2528 题意: 在墙上贴海报,输入n(1<=n<=10000),表示n张海报,后n行输入 两整数l,r  ( 1<= l, r<= 1e9 ),表示海报从编号为l的石头一直贴到编号为r的石头,输入顺序即为粘贴顺序.问n张贴完之后,还能看到多少张海报. 思路: 显然区间操作,很容易联想到线段树操作,只不过区间 l,r 最大范围可达1e9,直接建树,内存必爆.   那么就需要避开1e9的数据,进行离散化,将区间变成(1到n

线段树区间更新

区间更新也可以分割成若干个子区间, 每层的结点至多选取 2 个,时间复杂度 O(logn). 懒惰(Lazy)标记 懒惰标记,也可称为延迟标记.一个区间可以转化为若干个结点,每个结点设一个标记,记录这个结点被进行了某种修改操作(这种修改操作会影响其子结点). 也就是说,仅修改到这些结点,暂不修改其子结点:而后决定访问其子节点时,再下传懒惰 (Lazy) 标记,并消除原来的标记. 优点在于,不用将区间的所有值暴力更新,大大提高效率. 在区间修改的一类问题中,我们可以设一个 delta 域,表示该节

POJ 3468 A Simple Problem with Integers(线段树区间更新)

题目地址:POJ 3468 打了个篮球回来果然神经有点冲动..无脑的狂交了8次WA..居然是更新的时候把r-l写成了l-r... 这题就是区间更新裸题.区间更新就是加一个lazy标记,延迟标记,只有向下查询的时候才将lazy标记向下更新.其他的均按线段树的来就行. 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <math.h> #include <stac

hdu 5023 A Corrupt Mayor&#39;s Performance Art(线段树区间更新)

#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; int tree[5001000],add[5001000]; int color[50]; int n,m; void pushup(int pos) { tree[pos]=tree[pos<<1]|tree[pos<<1|1]; //更新

poj-----(2528)Mayor&#39;s posters(线段树区间更新及区间统计+离散化)

Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 43507   Accepted: 12693 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral post

POJ 2777 &amp;&amp; ZOJ 1610 &amp;&amp;HDU 1698 --线段树--区间更新

直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 -- 区间更新的话 分为 增减 或者 修改 主要就是个 laze 标记 就是延迟更新 对于区间更新的写法 一般是有2种 其一 仔细划分到每个细小的区间    另一 粗略划分 反正 ==我的代码里会给出2种写法 看自己喜好 hdu 1 //线段树 成段更新 ---> 替换 根结点的查询 2 3 #i

HDU 1698 Just a Hook (线段树延迟标记(lazy))

题意:有n个数初始值都为1,m个操作a,b,c,表示把区间[a,b]变为c,求最后n个数的和. 经典区间更新求和问题,需要用到延迟标记(或者说是懒惰标记),简单老说就是每次更新 的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新或询问的时候. #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cm