poj 2777 AND hdu 5316 线段树
区间染色问题,用线段树可以解决。颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色“或”起来,加上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 线段树相关推荐
- POJ 2777 Count Color (线段树区间修改 + 状态压缩)
题目链接:POJ 2777 Count Color [题目大意] 给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时 板子的颜色都是 1: 有两种操作 1 .把给定区间的板子染成一 ...
- POJ 2777 - Count Color(线段树区间更新+状态压缩)
题目链接 https://cn.vjudge.net/problem/POJ-2777 [题意] 有一个长度为 LLL 的区间 [1,L][1,L][1,L] ,有 TTT 种颜色可以涂,有 QQQ ...
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
- poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化
第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...
- POJ 1177 Picture [离散化+扫描线+线段树]
http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...
- hdu 5367(线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...
- hdu 5266(线段树+LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...
- hdu 5124(线段树区间更新+lazy思想)
http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...
- POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 53703 Accepted: 25237 ...
最新文章
- 云服务器 ECS 建站教程:手工部署Java Web项目
- 蓝桥杯比赛常考算法_备战蓝桥--算法竞赛入门第一章总结
- 初始化稀疏矩阵 matlab,访问稀疏矩阵
- MATLAB Simulink
- MathWorks 中国
- Hibernate 拦截器的使用--动态表名
- 正泰eplan_【万泉河】给EPLAN初学者的建议:不用宏
- 数据结构与算法:单链表(利用万能指针实现对任意类型数据进行操作)
- 丢瓶盖(洛谷-P1316)
- 协议森林09 爱的传声筒 (TCP连接)
- python读取modis数据
- VC++动态链接库编程之MFC规则DLL
- 用char*作为map的key
- 判断m是否为素数c语言程序,c语言判断是否素数程序代码
- 信贷风控四:高校地址自动化识别
- 步进电机驱动控制器,电动云台控制。
- java实现网页结构分析,网页列表发现
- 电路交换、报文交换、分组交换各自的特点
- 滴滴:去年协助警方破获25案件 成立打击黑产专项组
- 造命者天,立命者我_huadingjin_新浪博客
- Android 设置铃声——给app设置自定义铃声功能
- 【解耦Excel导出服务】开发日志
热门文章
- Qt只有release
- php swoole 游戏框架,Swoole 高性能php框架
- yum install / yum localinstall
- python sqlite3 怎么把字典存入数据库中.
- eos-unittest
- 一文详解LDA主题模型
- 淘宝开源Key/Value结构数据存储系统Tair技术剖析
- Modules:PETCTFusion-Documentation-3.6
- DCMTK3.6.0(MD支持库)安装说明-无图版
- SDL2 undefined reference to `SDL_Init' 问题