codedecision P1112 区间连续段 题解 线段树
题目描述:https://www.cnblogs.com/problems/p/P1112.html
题目链接:http://codedecision.com/problem/1112
线段树区间操作,每一个线段对应的点包含三个信息:
- \(l\):表示这个区间最左边的点的数值;
- \(r\):表示这个区间最右边的点的数值;
- \(cnt\):表示这个区间有多少个数值段。
合并的时候:
- 根节点的 \(l\) 值等于左儿子节点的 \(l\) 值;
- 根节点的 \(r\) 值等于右儿子节点的 \(r\) 值;
- 根节点的 \(cnt\) 值取决于左儿子的 \(r\) 值和右儿子的 \(l\) 值是否相等,
- 如果相等,则为:左儿子的 \(cnt\) + 右儿子的 \(cnt\) - 1
- 否则,为:左儿子的 \(cnt\) + 右儿子的 \(cnt\)
 
更新的时候,如果节点表示的这一段区间全在区间范围内,
则将节点的 \(l\) 和 \(r\) 都置为将要更新的值,并将节点的 \(cnt\) 置为 1。
因为涉及区间操作,需要用到延迟操作。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100100;
struct Node {
    int l, r, cnt;
    Node () {}
    Node (int _l, int _r, int _cnt) { l = _l; r = _r; cnt = _cnt; }
} tree[maxn<<2];
int n, lazy[maxn<<2];
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
void push_up(int rt) {
    tree[rt].l = tree[rt<<1].l;
    tree[rt].r = tree[rt<<1|1].r;
    tree[rt].cnt = tree[rt<<1].cnt + tree[rt<<1|1].cnt - (tree[rt<<1].r == tree[rt<<1|1].l ? 1 : 0);
}
void push_down(int rt) {
    if (lazy[rt]) {
        lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt];
        tree[rt<<1].cnt = tree[rt<<1|1].cnt = 1;
        tree[rt<<1].l = tree[rt<<1].r = tree[rt<<1|1].l = tree[rt<<1|1].r = lazy[rt];
        lazy[rt] = 0;
    }
}
void build(int l, int r, int rt) {
    if (l == r) {
        tree[rt] = Node(0, 0, 1);
        return;
    }
    int mid = (l + r) / 2;
    build(lson);
    build(rson);
    push_up(rt);
}
void update(int L, int R, int v, int l, int r, int rt) {
    if (L <= l && r <= R) {
        tree[rt] = Node(v, v, 1);
        lazy[rt] = v;
        return;
    }
    push_down(rt);
    int mid = (l + r) / 2;
    if (L <= mid) update(L, R, v, lson);
    if (R > mid) update(L, R, v, rson);
    push_up(rt);
}
Node query(int L, int R, int l, int r, int rt) {
    if (L <= l && r <= R) return tree[rt];
    push_down(rt);
    int mid = (l + r) / 2;
    if (L > mid) return query(L, R, rson);
    else if (R <= mid) return query(L, R, lson);
    else {
        Node a = query(L, R, lson);
        Node b = query(L, R, rson);
        return Node(a.l, b.r, a.cnt + b.cnt - (a.r == b.l ? 1 : 0));
    }
}
int m, x, y, a;
string op;
int main() {
    cin >> n >> m;
    build(1, n, 1);
    while (m --) {
        cin >> op;
        if (op == "update") {
            cin >> x >> y >> a;
            update(x, y, a, 1, n, 1);
        }
        else {
            cin >> x >> y;
            cout << query(x, y, 1, n, 1).cnt << endl;
        }
    }
    return 0;
}
codedecision P1112 区间连续段 题解 线段树的更多相关文章
- codedecision P1113 同颜色询问 题解 线段树动态开点
		题目描述:https://www.cnblogs.com/problems/p/11789930.html 题目链接:http://codedecision.com/problem/1113 这道题目 ... 
- 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel
		https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ... 
- P1112 区间连续段
		题目描述 给你一个长度为n的数组 \(a_1, a_2, \dots a_n\) . 一开始这n个元素都为0. 然后有m次操作,每次操作有两种操作类型: update x y a:将区间 \([x,y ... 
- POJ2182题解——线段树
		POJ2182题解——线段树 2019-12-20 by juruoOIer 1.线段树简介(来源:百度百科) 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线 ... 
- 最大矩阵覆盖权值--(静态连续最大子段 (线段树) )-HDU(6638)Snowy Smile
		这题是杭电多校2019第六场的题目 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6638 题意:给你平面上n个点,每个点都有权值(有负权),让你计算一 ... 
- 理想乡题解 (线段树优化dp)
		题面 思路概述 首先,不难想到本题可以用动态规划来解,这里就省略是如何想到动态规划的了. 转移方程 f[i]=min(f[j]+1)(max(i-m,0)<=j<i 且j符合士兵限定) 注 ... 
- luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set
		不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ... 
- [bzoj2752]高速公路 题解(线段树)
		2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2102 Solved: 887[Submit] ... 
- LA 3938 动态最大连续和(线段树)
		https://vjudge.net/problem/UVALive-3938 题意:给出一个长度为n的整数序列D,你的任务是对m个询问作出回答.对于询问(a,b),需要找到两个下标x和y,使得a≤x ... 
随机推荐
- js中保存成图片并下载
			1.保存canvas中绘制的内容为图片 HTML代码: <canvas id="canvas" width="400" height="400& ... 
- golang数组 排序和查找
			package main import "fmt" func BubbleSort(arr *[5]int){ fmt.Println("排序前arr=",(* ... 
- oracle 处理表的一列
			---删除一列和数据一起删除了. ALTER TABLE 表名 DROP COLUMN 列名; ---添加一列 alert table 表名 add column 列名; ---只删除一列的数据 没有 ... 
- 【水滴石穿】react-native-book
			先推荐一个学习的地址:https://ke.qq.com/webcourse/index.html#cid=203313&term_id=100240778&taid=12778558 ... 
- MSSQL2008 数据压缩方法
			数据压缩功能使得SOL Server 2008允许在表.索引和分区中执行数据压缩,这样不仅可以节省磁盘空间,而且允许更多数据置入RAM中,从而提升数据库查询的性能. 1.启用行压缩 如果我们要在指定的 ... 
- 阿里云王广芳:5G时代,我们需要怎样的边缘计算?
			7月24日阿里云峰会开发者大会的IT基础设施云化专场中,阿里云边缘计算高级技术专家王广芳进行了边缘节点服务重大升级发布,同时与现场观众一同探讨了5G时代边缘计算的思考与技术实践. 5G时代,我们需要怎 ... 
- 技巧专题3(cdq分治、整体二分等)
			cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ... 
- LintCode_67 二叉树中序遍历
			题目 给出一棵二叉树,返回其中序遍历 C++ 非递归 vector<int> inorderTraversal(TreeNode *root) { // write your code h ... 
- 【JZOJ4920】【NOIP2017提高组模拟12.10】降雷皇
			题目描述 降雷皇哈蒙很喜欢雷电,他想找到神奇的电光. 哈蒙有n条导线排成一排,每条导线有一个电阻值,神奇的电光只能从一根导线传到电阻比它大的上面,而且必须从左边向右传导,当然导线不必是连续的. 哈蒙想 ... 
- 从 Program Manager 看 Leader 是什么角色
			http://blog.csdn.net/uxyheaven/article/details/50396951 从 Program Manager 看 Leader 是什么角色 转载请注明出处http ... 
