直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧

直接先上链接了

    touch me

    touch me

    touch me

关于涉及到区间的修改 -- 区间更新的话 分为 增减 或者 修改

主要就是个 laze 标记 就是延迟更新

对于区间更新的写法 一般是有2种 其一 仔细划分到每个细小的区间    另一 粗略划分

反正 ==我的代码里会给出2种写法 看自己喜好

hdu

 1 //线段树 成段更新 ---> 替换    根结点的查询
 2
 3 #include <iostream>
 4 using namespace std;
 5
 6 const int size = 100010;
 7
 8 struct data
 9 {
10     int l;
11     int r;
12     int flag;
13     int sum;
14 }tree[ size*3 ];
15
16 void create( int root , int l , int r )
17 {
18     int mid = l + (r-l)/2;
19     tree[root].l = l;
20     tree[root].r = r;
21     tree[root].flag = 0;
22     if( l==r )
23     {
24         tree[root].sum = 1;
25         return;
26     }
27     create( root<<1 , l , mid );
28     create( root<<1|1 , mid+1 , r );
29     tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
30 }
31
32 void add( int root , int len  )
33 {
34     tree[root<<1].flag = tree[root<<1|1].flag = tree[root].flag ;
35     tree[root<<1].sum = ( len - len/2 ) * tree[root].flag ;
36     tree[root<<1|1].sum = len/2*tree[root].flag;
37     tree[root].flag = 0;
38 }
39
40 void update( int root , int L , int R , int num )
41 {
42     int mid = tree[root].l + ( tree[root].r - tree[root].l ) / 2;
43     if( tree[root].l == L && tree[root].r==R )
44     {
45         tree[root].flag= num;
46         tree[root].sum = num * ( tree[root].r - tree[root].l + 1 );
47         return;
48     }
49     if( tree[root].flag )
50     {
51         add( root , tree[root].r-tree[root].l+1 );
52     }
53     if( R<=mid ) // 左子树
54     {
55         update( root<<1 , L , R , num );
56     }
57     else if( L>=mid+1 ) // 右子树
58     {
59         update( root<<1|1 , L , R , num );
60     }
61     else // 覆盖左右 子树
62     {
63         update( root<<1 , L , mid , num );
64         update( root<<1|1 , mid+1 , R , num );
65     }
66     tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
67 }
68
69 int main()
70 {
71     int t , n , oper;
72     int L , R , num;
73     while( ~scanf("%d",&t) )
74     {
75         for( int i = 1 ; i<=t ; i++ )
76         {
77             scanf( "%d",&n );
78             scanf( "%d",&oper );
79             create( 1 , 1 , n );
80             while( oper-- )
81             {
82                 scanf( "%d %d %d",&L,&R,&num );
83                 update( 1 , L , R , num );
84             }
85             printf( "Case %d: The total value of the hook is %d.\n",i,tree[1].sum );
86         }
87     }
88     return 0;
89 }

View Code

POJ

  1 //线段树--区间更新--替换 区间查询---B
  2 #include <iostream>
  3 #include <algorithm>
  4 using namespace std;
  5
  6 int sum;
  7 const int size = 100010;
  8 struct data
  9 {
 10     int l;
 11     int r;
 12     int color;
 13     bool flag;
 14 }tree[size*3];
 15
 16 void create( int root , int l , int r )
 17 {
 18     int mid = ( l + r ) / 2;
 19     tree[root].l = l;
 20     tree[root].r = r;
 21     tree[root].color = 1;
 22     tree[root].flag = false;
 23     if( l==r )
 24     {
 25         return;
 26     }
 27     create( root<<1 , l , mid );
 28     create( root<<1|1 , mid+1 , r );
 29 }
 30
 31 void add( int root )
 32 {
 33     tree[root<<1].flag = true;
 34     tree[root<<1|1].flag = true;
 35     tree[root<<1].color = tree[root].color;
 36     tree[root<<1|1].color = tree[root].color;
 37     tree[root].flag = false;
 38 }
 39
 40 void update( int root , int L , int R , int num )
 41 {
 42     int mid = ( tree[root].l + tree[root].r ) / 2;
 43     if( tree[root].l == L && tree[root].r ==R )
 44     {
 45         tree[root].flag = true;
 46         tree[root].color = num;
 47         return;
 48     }
 49     if( tree[root].color == num )
 50     {
 51         return;
 52     }
 53     if( tree[root].flag )
 54     {
 55         add( root );
 56     }
 57     if( L>=mid+1 )
 58     {
 59         update( root<<1|1 , L , R , num );
 60     }
 61     else if( R<=mid )
 62     {
 63         update( root<<1 , L , R , num );
 64     }
 65     else
 66     {
 67         update( root<<1 , L , mid , num );
 68         update( root<<1|1 , mid+1 , R , num );
 69     }
 70     tree[root].color = tree[root<<1].color | tree[root<<1|1].color;
 71 }
 72
 73 void query( int root , int L , int R )
 74 {
 75     int mid = ( tree[root].l + tree[root].r ) / 2;
 76     if( tree[root].l ==L && tree[root].r ==R )
 77     {
 78         sum |= tree[root].color;
 79         return;
 80     }
 81     if( tree[root].flag )
 82     {
 83         add( root );
 84     }
 85     if( L>=mid+1 )
 86     {
 87         query( root<<1|1 , L , R );
 88     }
 89     else if( R<=mid )
 90     {
 91         query( root<<1 , L , R );
 92     }
 93     else
 94     {
 95         query( root<<1 , L , mid );
 96         query( root<<1|1 , mid+1 , R );
 97     }
 98 }
 99
100 int main()
101 {
102     int cnt;
103     int n , m , oper;
104     char ch;
105     int L , R , num;
106     while( ~scanf("%d %d",&n,&m) )
107     {
108         create( 1 , 1 , n );
109         scanf( "%d",&oper );
110         while( oper-- )
111         {
112             getchar();
113             scanf( "%c",&ch );
114             if( ch=='C' )
115             {
116                 scanf( "%d %d %d",&L,&R,&num );
117                 if( L>R )
118                 {
119                     swap( L ,R );
120                 }
121                 update( 1 , L , R , 1<<(num-1) );
122             }
123             else
124             {
125                 scanf( "%d %d",&L,&R );
126                 if( L>R )
127                 {
128                     swap( L , R );
129                 }
130                 cnt = sum = 0;
131                 query( 1 , L , R );
132                 while( sum )
133                 {
134                     if( sum&1 )
135                     {
136                         cnt++;
137                     }
138                     sum>>=1;
139                 }
140                 printf( "%d\n",cnt );
141             }
142         }
143     }
144     return 0;
145 }

View Code

ZOJ

  1 //线段树 --区间更新-替换  -- A
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cstdio>
  5 using namespace std;
  6
  7 int n;
  8 const int size = 8080;
  9 struct data
 10 {
 11     int l;
 12     int r;
 13     int flag;
 14 }tree[size*3];
 15 int color[size];
 16 int avoid;
 17 int cnt[size];
 18
 19 void create( int root , int l , int r )
 20 {
 21     int mid = ( l + r ) / 2;
 22     tree[root].l = l;
 23     tree[root].r = r;
 24     tree[root].flag = -1;
 25     if( l==r )
 26     {
 27         return;
 28     }
 29     create( root<<1 , l , mid );
 30     create( root<<1|1 , mid+1 , r );
 31 }
 32
 33 void add( int root )
 34 {
 35     tree[root<<1].flag = tree[root<<1|1].flag = tree[root].flag;
 36     tree[root].flag = -1;
 37 }
 38
 39 void update( int root , int L , int R , int num )
 40 {
 41     int mid = ( tree[root].l + tree[root].r )/2;
 42      if( tree[root].flag == num )
 43         return;
 44     if( tree[root].l>=L && tree[root].r<=R )
 45     {
 46         tree[root].flag = num;
 47         return;
 48     }
 49     if( tree[root].flag!=-1 )
 50     {
 51         add( root );
 52     }
 53     /*
 54     if( R<=mid )
 55     {
 56         update( root<<1 , L , R , num );
 57     }
 58     else if( L>=mid+1 )
 59     {
 60         update( root<<1|1 , L , R , num );
 61     }
 62     else
 63     {
 64         update( root<<1 , L , mid , num );
 65         update( root<<1|1 , mid+1 , R , num );
 66     }
 67     */
 68     if( L<=mid )
 69     {
 70         update( root<<1 , L , R , num );
 71     }
 72     if( R>mid )
 73     {
 74         update( root<<1|1 , L , R , num );
 75     }
 76     if( tree[root<<1].flag == tree[root<<1|1].flag && tree[root<<1].flag!=-1 )
 77     {
 78         tree[root].flag = tree[root<<1].flag;
 79     }
 80 }
 81
 82 void solve( int root )
 83 {
 84     if( tree[root].flag!=-1 )
 85     {
 86         //cout<<"root"<<root<<endl;
 87         for( int i = tree[root].l ; i<=tree[root].r ; i++ )
 88         {
 89             color[i] = tree[root].flag;
 90             //cout<<"color:"<<color[i]<<endl;
 91         }
 92         return;
 93     }
 94     if( tree[root].l == tree[root].r )
 95         return;
 96     solve( root<<1 );
 97     solve( root<<1|1 );
 98 }
 99
100 void getAns()
101 {
102     int former = -1;
103     for( int i = 0 ; i<size ; i++ )
104     {
105         if( former != color[i] )
106         {
107             former = color[i];
108             cnt[former]++;
109             //cout<<"数量"<<cnt[former]<<"   former:"<<former<<endl;
110         }
111     }
112     for( int i = 0 ; i<size ; i++ )
113     {
114         if( cnt[i]!=0 )
115         {
116             printf( "%d %d\n",i,cnt[i] );
117         }
118     }
119     printf( "\n" );
120 }
121
122 int main()
123 {
124     int L , R , num;
125     while( ~scanf("%d",&n) )
126     {
127         memset( color , -1 , sizeof(color) );
128         memset( cnt , 0 , sizeof(cnt) );
129         create(1,0,size);
130         for( int i = 0 ; i<n ; i++ )
131         {
132             scanf( "%d %d %d",&L,&R,&num );
133             update( 1 , L , R-1 , num );
134         }
135         solve(1);
136         getAns();
137     }
138     return 0;
139 }

View Code

today:

  I am ingratiated by the sunset because of her sensitivity
  As she tries to push the darkness back for just a moment more.
  But like so many times before…To no avail!

转载于:https://www.cnblogs.com/radical/p/3825075.html

POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新相关推荐

  1. hdu 1698(线段树区间更新)

    解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...

  2. hdu 3954(线段树区间更新)

    转载标记处:http://www.cnblogs.com/wang-jue/articles/2920341.html 思路:这道题所得到的经验与每个英雄的等级有关,一般的可能就用线段树一直更新到每一 ...

  3. hdu 5124(线段树区间更新+lazy思想)

    http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...

  4. ZOJ 1610 Count the Colors (线段树区间更新)

    题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...

  5. hdu 5692 Snacks(dfs序+线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...

  6. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  7. Just a Hook(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 In the game of DotA, Pudge's meat hook is actual ...

  8. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,"模拟都市"是他们非常喜欢的一个游戏 ...

  9. CodeForces - 272C Dima and Staircase (线段树区间更新)

    题意: 见以下样例,给出 5 个区间,每个区间的高度已知.一共 4 次操作.每次操作都是从最左边开始向下垒一个宽为 w 高为h 的木块,过程见下图. 问每次垒木块的高度是多少? Input 5 1 2 ...

最新文章

  1. 利用交换机解决局域网ARP问题(51CTO博客出书活动)
  2. JZOJ 5185. 【NOIP2017提高组模拟6.30】tty's sequence
  3. 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁
  4. 编写数据驱动的单元测试的代码
  5. cell数组变为字符串_字符串匹配 ---- BM 算法原理
  6. 创业失败感悟第十四天
  7. 【Dairy】2016.11.5
  8. 2018上IEC计算机高级语言(C)作业 第1次作业 。
  9. CloudStack + KVM + HA
  10. 安川机器人如何注释化指令_安川机器人指令案例汇总
  11. FTL(闪存转换层)简单介绍
  12. jdbc跨库查询 mysql_JDBC如何实现跨数据库的查询
  13. 计算机无steam服务,有了这个,或许以后都不用登录电脑的Steam了
  14. 5款实用报表工具分析,报表工具这样选!
  15. 软考高级 真题 2011年下半年 信息系统项目管理师 综合知识
  16. css层叠样式表——css基础介绍
  17. 图、邻接矩阵、广度与深度优先、生成树
  18. ENVI|一天一个小技能|APP STORE浏览并下载矢量数据
  19. 计算机病毒和木马完全相同,木马和计算机病毒的特点
  20. 张俊红 python_我的朋友张俊红成长之路

热门文章

  1. 内涝预测过程的噪音_提高人工智能模型准确率的测试过程中需要注意什么?
  2. PHP更新小程序,微信小程序Tab页切换更新数据详细介绍
  3. 刚构桥的优缺点_[中交公规院]预应力连续刚构桥总体设计及主要尺寸
  4. mongodb 无法查出数据_MongoDB,再见还是再等等?
  5. mysql必会语法_sql语法:sql必读必会(二)mysql中的函数大全
  6. python类介绍_Python基础介绍 | Class类
  7. c语言三线程,如何用C语言实现多线程
  8. vue 文件导入服务器,Vue 如何import服务器上的js配置文件
  9. java基础大概_Java基础知识(一)
  10. java 事务嵌套_解惑 spring 嵌套事务