区间染色问题,用线段树可以解决。颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色“或”起来,加上lazy标记,轻松AC。

poj 2777:

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 using namespace std;
  5
  6 const int N = 100001;
  7
  8 struct Node
  9 {
 10     int l, r, color;
 11     bool lazy;
 12 } node[N << 2];
 13
 14 void build( int i, int l, int r )
 15 {
 16     node[i].l = l, node[i].r = r, node[i].color = 1, node[i].lazy = false;
 17     if ( l == r ) return ;
 18     int mid = ( l + r ) >> 1;
 19     build( i << 1, l, mid );
 20     build( i << 1 | 1, mid + 1, r );
 21 }
 22
 23 void pushup( int i )
 24 {
 25     node[i].color = ( node[i << 1].color | node[i << 1 | 1].color );
 26 }
 27
 28 void pushdown( int i )
 29 {
 30     if ( node[i].lazy )
 31     {
 32         node[i].lazy = false;
 33         int lc = i << 1, rc = lc | 1;
 34         node[lc].lazy = node[rc].lazy = true;
 35         node[lc].color = node[rc].color = node[i].color;
 36     }
 37 }
 38
 39 void update( int i, int l, int r, int c )
 40 {
 41     if ( node[i].l == l && node[i].r == r )
 42     {
 43         node[i].lazy = true;
 44         node[i].color = c;
 45         return ;
 46     }
 47     pushdown(i);
 48     int mid = ( node[i].l + node[i].r ) >> 1;
 49     if ( r <= mid )
 50     {
 51         update( i << 1, l, r, c );
 52     }
 53     else if ( l > mid )
 54     {
 55         update( i << 1 | 1, l, r, c );
 56     }
 57     else
 58     {
 59         update( i << 1, l, mid, c );
 60         update( i << 1 | 1, mid + 1, r, c );
 61     }
 62     pushup(i);
 63 }
 64
 65 int query( int i, int l, int r )
 66 {
 67     if ( node[i].l == l && node[i].r == r )
 68     {
 69         return node[i].color;
 70     }
 71     pushdown(i);
 72     int mid = ( node[i].l + node[i].r ) >> 1;
 73     if ( r <= mid )
 74     {
 75         return query( i << 1, l, r );
 76     }
 77     else if ( l > mid )
 78     {
 79         return query( i << 1 | 1, l, r );
 80     }
 81     else
 82     {
 83         int la = query( i << 1, l, mid );
 84         int ra = query( i << 1 | 1, mid + 1, r );
 85         return ( la | ra );
 86     }
 87 }
 88
 89 int main ()
 90 {
 91     int l, t, o;
 92     while ( scanf("%d%d%d", &l, &t, &o) != EOF )
 93     {
 94         build( 1, 1, l );
 95         char op[2];
 96         int a, b, c;
 97         while ( o-- )
 98         {
 99             scanf("%s", op);
100             if ( op[0] == 'C' )
101             {
102                 scanf("%d%d%d", &a, &b, &c);
103                 if ( a > b ) swap( a, b );
104                 c = ( 1 << ( c - 1 ) );
105                 update( 1, a, b, c );
106             }
107             else
108             {
109                 scanf("%d%d", &a, &b);
110                 if ( a > b ) swap( a, b );
111                 int ans = query( 1, a, b ), cnt = 0;
112                 while ( ans )
113                 {
114                     if ( ans & 1 )
115                     {
116                         cnt++;
117                     }
118                     ans >>= 1;
119                 }
120                 printf("%d\n", cnt);
121             }
122         }
123     }
124     return 0;
125 } 

hdu 5316(和poj 2777基本一样):

  1 #include <cstring>
  2 #include <cstdio>
  3 using namespace std;
  4
  5 const int N = 1000001;
  6
  7 struct Node
  8 {
  9     int l, r, color;
 10     bool lazy;
 11 } node[N << 2];
 12
 13 void build( int i, int l, int r )
 14 {
 15     node[i].l = l, node[i].r = r, node[i].color = 2, node[i].lazy = false;
 16     if ( l == r ) return ;
 17     int mid = ( l + r ) >> 1;
 18     build( i << 1, l, mid );
 19     build( i << 1 | 1, mid + 1, r );
 20 }
 21
 22 void pushup( int i )
 23 {
 24     node[i].color = ( node[i << 1].color | node[i << 1 | 1].color );
 25 }
 26
 27 void pushdown( int i )
 28 {
 29     if ( node[i].lazy )
 30     {
 31         node[i].lazy = false;
 32         int lc = i << 1, rc = lc | 1;
 33         node[lc].lazy = node[rc].lazy = true;
 34         node[lc].color = node[rc].color = node[i].color;
 35     }
 36 }
 37
 38 void update( int i, int l, int r, int c )
 39 {
 40     if ( node[i].l == l && node[i].r == r )
 41     {
 42         node[i].lazy = true;
 43         node[i].color = c;
 44         return ;
 45     }
 46     pushdown(i);
 47     int mid = ( node[i].l + node[i].r ) >> 1;
 48     if ( r <= mid )
 49     {
 50         update( i << 1, l, r, c );
 51     }
 52     else if ( l > mid )
 53     {
 54         update( i << 1 | 1, l, r, c );
 55     }
 56     else
 57     {
 58         update( i << 1, l, mid, c );
 59         update( i << 1 | 1, mid + 1, r, c );
 60     }
 61     pushup(i);
 62 }
 63
 64 int query( int i, int l, int r )
 65 {
 66     if ( node[i].l == l && node[i].r == r )
 67     {
 68         return node[i].color;
 69     }
 70     pushdown(i);
 71     int mid = ( node[i].l + node[i].r ) >> 1;
 72     if ( r <= mid )
 73     {
 74         return query( i << 1, l, r );
 75     }
 76     else if ( l > mid )
 77     {
 78         return query( i << 1 | 1, l, r );
 79     }
 80     else
 81     {
 82         int la = query( i << 1, l, mid );
 83         int ra = query( i << 1 | 1, mid + 1, r );
 84         return ( la | ra );
 85     }
 86 }
 87
 88 int main ()
 89 {
 90     int n, m;
 91     while ( scanf("%d%d", &n, &m) != EOF )
 92     {
 93         if ( n == 0 && m == 0 ) break;
 94         build( 1, 1, n );
 95         char op[2];
 96         int a, b, c;
 97         while ( m-- )
 98         {
 99             scanf("%s", op);
100             if ( op[0] == 'P' )
101             {
102                 scanf("%d%d%d", &a, &b, &c);
103                 c = ( 1 << ( c - 1 ) );
104                 update( 1, a, b, c );
105             }
106             else
107             {
108                 scanf("%d%d", &a, &b);
109                 int ans = query( 1, a, b ), cnt = 0, oo[30];
110                 for ( int i = 0; i < 30; i++ )
111                 {
112                     if ( ans & ( 1 << i ) )
113                     {
114                         oo[cnt++] = i + 1;
115                     }
116                 }
117                 for ( int i = 0; i < cnt; i++ )
118                 {
119                     printf("%d", oo[i]);
120                     if ( i != cnt - 1 ) putchar(' ');
121                     else putchar('\n');
122                 }
123             }
124         }
125     }
126     return 0;
127 }

转载于:https://www.cnblogs.com/huoxiayu/p/4685721.html

poj 2777 AND hdu 5316 线段树相关推荐

  1. POJ 2777 Count Color (线段树区间修改 + 状态压缩)

    题目链接:POJ 2777 Count Color [题目大意] 给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时  板子的颜色都是 1: 有两种操作 1 .把给定区间的板子染成一 ...

  2. POJ 2777 - Count Color(线段树区间更新+状态压缩)

    题目链接 https://cn.vjudge.net/problem/POJ-2777 [题意] 有一个长度为 LLL 的区间 [1,L][1,L][1,L] ,有 TTT 种颜色可以涂,有 QQQ ...

  3. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  4. poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化

    第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...

  5. POJ 1177 Picture [离散化+扫描线+线段树]

    http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...

  6. hdu 5367(线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...

  7. hdu 5266(线段树+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...

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

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

  9. POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53703   Accepted: 25237 ...

最新文章

  1. 云服务器 ECS 建站教程:手工部署Java Web项目
  2. 蓝桥杯比赛常考算法_备战蓝桥--算法竞赛入门第一章总结
  3. 初始化稀疏矩阵 matlab,访问稀疏矩阵 - MATLAB Simulink - MathWorks 中国
  4. Hibernate 拦截器的使用--动态表名
  5. 正泰eplan_【万泉河】给EPLAN初学者的建议:不用宏
  6. 数据结构与算法:单链表(利用万能指针实现对任意类型数据进行操作)
  7. 丢瓶盖(洛谷-P1316)
  8. 协议森林09 爱的传声筒 (TCP连接)
  9. python读取modis数据
  10. VC++动态链接库编程之MFC规则DLL
  11. 用char*作为map的key
  12. 判断m是否为素数c语言程序,c语言判断是否素数程序代码
  13. 信贷风控四:高校地址自动化识别
  14. 步进电机驱动控制器,电动云台控制。
  15. java实现网页结构分析,网页列表发现
  16. 电路交换、报文交换、分组交换各自的特点
  17. 滴滴:去年协助警方破获25案件 成立打击黑产专项组
  18. 造命者天,立命者我_huadingjin_新浪博客
  19. Android 设置铃声——给app设置自定义铃声功能
  20. 【解耦Excel导出服务】开发日志

热门文章

  1. Qt只有release
  2. php swoole 游戏框架,Swoole 高性能php框架
  3. yum install / yum localinstall
  4. python sqlite3 怎么把字典存入数据库中.
  5. eos-unittest
  6. 一文详解LDA主题模型
  7. 淘宝开源Key/Value结构数据存储系统Tair技术剖析
  8. Modules:PETCTFusion-Documentation-3.6
  9. DCMTK3.6.0(MD支持库)安装说明-无图版
  10. SDL2 undefined reference to `SDL_Init' 问题