poj 2528 动态线段树
2015-09-17 12:00
274 查看
动态建立结点就不用离散化了,细节见代码,相信还是比较好理解的。
#include <iostream> #include <cstring> #include <cstdio> #include <set> using namespace std; const int N = 500000; set<int> s; int cnt; struct Node { int lc, rc, l, r, c; void init( int _l, int _r, int _c ) { l = _l, r = _r, c = _c; lc = rc = -1; } } node[N << 2]; void pushdown( int i ) { if ( node[i].c != -1 ) { node[node[i].lc].c = node[i].c; node[node[i].rc].c = node[i].c; node[i].c = -1; } } void update( int i, int l, int r, int c ) { if ( node[i].l == l && node[i].r == r ) { node[i].c = c; return ; } int mid = ( node[i].l + node[i].r ) >> 1; if ( node[i].lc == -1 ) { node[i].lc = cnt; node[cnt].init( node[i].l, mid, -1 ); cnt++; } if ( node[i].rc == -1 ) { node[i].rc = cnt; node[cnt].init( mid + 1, node[i].r, -1 ); cnt++; } pushdown(i); if ( r <= mid ) { update( node[i].lc, l, r, c ); } else if ( l > mid ) { update( node[i].rc, l, r, c ); } else { update( node[i].lc, l, mid, c ); update( node[i].rc, mid + 1, r, c ); } } void dfs( int i ) { if ( node[i].c != -1 ) { s.insert( node[i].c ); return ; } if ( node[i].lc != -1 ) dfs( node[i].lc ); if ( node[i].rc != -1 ) dfs( node[i].rc ); } int main () { int t; scanf("%d", &t); while ( t-- ) { int n; scanf("%d", &n); node[0].init( 1, 10000000, -1 ); cnt = 1; s.clear(); for ( int i = 0; i < n; i++ ) { int l, r; scanf("%d%d", &l, &r); if ( l > r ) swap( l, r ); update( 0, l, r, i ); } dfs(0); printf("%d\n", s.size()); } return 0; }
相关文章推荐
- 在navicat上设置定时计划执行存储过程
- Oracle 11g Dataguard参数详解
- BLE obtain uuid encoded in advertising packet
- android:Layout_weight正确的理解
- linux 安装mysql 服务端
- Emgu图片格式转换
- Android学习课程---Intent
- LeetCode219:Contains Duplicate II
- JAVA关键词synchronized的作用
- 【分享】事实上,你VS界面也可以如此,VS界面美化
- thinkphp 验证码功能(验证验证码)
- js之事件冒泡和事件捕获详细介绍
- c++primer plus 2.7编程练习作业
- iOS 警告收录及科学快速的消除方法
- Romberg
- Maven profile介绍
- OpenCV霍夫变换识别圆
- set(二叉搜索树)
- DB2数据库全系列版本安装介质下载地址
- Git服务器的Gitosis安装配置及gitignore的使用方法