[线段树] HDU 1698
来源:互联网 发布:2017年最流行的网络语 编辑:程序博客网 时间:2024/05/20 12:49
一步一步理解线段树: http://www.cnblogs.com/TenosDoIt/p/3453089.html#f
还是这个地址,这次用到了优化所用的区间延迟更新,时间复杂度是O(lgn)
PS:领教到了不好好命名变量的坑爹之处。。。。。。。
#include <cstdio>#include <cstring>#include <iostream>#define lson root * 2#define rson root * 2 + 1using namespace std;const int X = 100002 << 2;int Tree[ X ];int flag[ X ]; //延迟标记void build ( int root, int ST, int END ) { if ( ST == END ) { Tree[ root ] = 1; flag[ root ] = 0; } else { int mid = ( ST + END ) / 2; build ( lson, ST, mid ); build ( rson, mid + 1, END ); Tree[ root ] = Tree[ lson ] + Tree[ rson ]; }}// 延迟更新 时间O(lgn)// 当前root的标记向下更新void pushDown ( int root, int st, int end ) { if ( flag[ root ] ) { flag[ lson ] = flag[ rson ] = flag[ root ]; //传递z(要修改成)的值给子节点 int mid = ( st + end ) / 2; Tree[ lson ] = ( mid - st + 1 ) * flag[ root ]; //根代表的和 直接等于这段区间大小 * z Tree[ rson ] = ( end - ( mid + 1 ) + 1 ) * flag[ root ]; flag[ root ] = 0; }}// ST END --> required// st,end --> nowvoid update ( int root, int st, int end, int ST, int END, int val ) { if ( st > END || end < ST ) return; //找到要更新的整段区间 if ( st >= ST && end <= END ) { flag[ root ] = val; Tree[ root ] = val * ( end - st + 1 ); //更新这一段的根节点总和 return; } //建立flag,延迟更新子节点 pushDown ( root, st, end ); int mid = ( st + end ) / 2; if ( mid >= ST ) update ( lson, st, mid, ST, END, val ); if ( mid < END ) update ( rson, mid + 1, end, ST, END, val ); Tree[ root ] = Tree[ lson ] + Tree[ rson ];}int main () { int n; scanf ( "%d", &n ); for ( int i = 1; i <= n; ++i ) { memset ( flag, 0, sizeof ( flag ) ); int N, Q; scanf ( "%d%d", &N, &Q ); build ( 1, 1, N ); while ( Q-- ) { int x, y, z; scanf ( "%d%d%d", &x, &y, &z ); update ( 1, 1, N, x, y, z ); } printf ( "Case %d: The total value of the hook is %d.\n", i, Tree[ 1 ] ); } return 0;}
阅读全文
0 0
- HDU 1698 线段树
- hdu~1698~线段树
- HDU 1698 线段树
- HDU 1698 线段树
- hdu 1698 线段树
- [线段树] HDU 1698
- HDU-1698(线段树入门)
- hdu 1698 (线段树)
- HDU 1698 线段树区间
- hdu 1698 线段树(修改线段值)
- HDU 1698 Just a Hook 线段树
- [hdu]1698 Just a Hook -- 线段树
- hdu 1698 Just a Hook 线段树
- HDU 1698 JUST A HOOK(线段树)
- HDU 1698 Just a Hook 线段树
- hdu 1698 线段树 成段更新
- HDU-1698(线段树又写)
- HDU 1698 区间更新线段树
- LINUX学习笔记(十)
- 实验楼楼赛19之备份日志文件
- Mysql使用到substring截取字符串
- 第8周项目4(2) 稀疏矩阵的三元组表示的实现及应用
- bzoj2962 序列操作
- [线段树] HDU 1698
- linux 解压 压缩 tar.gz
- 学习一个多月C程序的感受
- 设计模式
- 方差、标准差、协方差、
- 【Swoole】PHP+Swoole的闭包写法
- Java中验证码的生成
- C语言中指向函数的指针
- springMVC Controller基本测试配置