注意离散化!!!线段树的叶子结点代表的是一段!!!

给出下面两个简单的例子应该能体现普通离散化的缺陷:
1-10 1-4 5-10
1-10 1-4 6-10

普通离散化算出来的结果都会是2,但是第二组样例结果是3

如果相邻数字间距大于1的话,在其中加上任意一个数字,比如加成[1,2,3,6,7,10],然后再做线段树就好了.

线段树功能:update 成段更新,query 查询整个线段树

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;const int MAXN = 20010;
int p[MAXN], mp[MAXN], pp[MAXN];
int pst[MAXN<<4], ans;
bool flag[MAXN];bool cmp(int A, int B)
{return p[A] < p[B];
}void push_down(int rt)
{if(pst[rt] == 0) return;pst[rt<<1] = pst[rt<<1|1] = pst[rt];pst[rt] = 0;
}void update(int L, int R, int c, int l, int r, int rt)
{if(L <= l && r <= R){pst[rt] = c;return;}push_down(rt);int m = (l + r) >> 1;if(m >= L) update(L, R, c, lson);if(m < R) update(L, R, c, rson);
}void query(int l, int r, int rt)
{if(pst[rt] > 0) //只有大于0才有海报
    {if(!flag[pst[rt]]) ans++;flag[pst[rt]] = 1;return;}if(l == r) return;push_down(rt);int m = (l + r) >> 1;query(lson);query(rson);
}int main()
{
//    freopen("in.txt", "r", stdin);int T, n;scanf("%d", &T);while(T--){scanf("%d", &n);for(int i=0; i<n; i++){scanf("%d%d", &p[i<<1], &p[i<<1|1]);mp[i<<1] = i<<1;mp[i<<1|1] = i<<1|1;}sort(mp, mp+2*n, cmp);pp[mp[0]] = 1;int N = 1;for(int i=1; i<2*n; i++)    //离散化
        {if(p[mp[i]] == p[mp[i-1]])pp[mp[i]] = N;else if(p[mp[i]] - p[mp[i-1]] > 1)  //大于1的插一个数
            {N += 2;pp[mp[i]] = N;}else pp[mp[i]] = ++N;}memset(pst, 0, sizeof(pst));for(int i=0; i<n; i++)update(pp[i<<1], pp[i<<1|1], i+1, 1, N, 1);memset(flag, 0, sizeof(flag));ans = 0;query(1, N, 1);printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/pach/p/7442620.html

POJ 2528 Mayor's posters 贴海报 线段树 区间更新相关推荐

  1. POJ 2528 Mayor's posters (离散化和线段树使用)

    还是做了线段树的题目,玩了两天也要继续看看题目了.之前就有看离散化的概念,大家可以去百度百科一下,简单转载一个例子 离散化 的大概思路 : 比如说给你一组 数据 1 4 1000 100000, 如果 ...

  2. POJ 3468 A Simple Problem with Integers(线段树区间更新)

    题目链接 这个真费劲...其实我也不懂 为什么...大体思想是,如果把区间更新了,开始的时候只把用懒惰标记标记那个区间,而不更新底层元素,而如果查询的时候顺带着把lz标记给消除...多敲几遍,多调试一 ...

  3. POJ 2528 Mayor's posters(线段树)

    题目大意 贴海报.每张海报的高度都是一样的,唯独宽度不一样.每张海报只能占用整数倍的单位线段长度,贴了 n(n<=10000) 张海报之后,有几张能够看见(有一个角能看见这张海报也算被看见了)? ...

  4. poj 2528 Mayor's posters(线段树+离散化)

    1 /* 2 poj 2528 Mayor's posters 3 线段树 + 离散化 4 5 离散化的理解: 6 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用 ...

  5. POJ-2528 Mayor's posters (离散化, 线段树)

    题目传送门: POJ-2528 题意就是在一个高度固定的墙面上贴高度相同宽度不同的海报,问贴到最后还能看到几张?本质上是线段树区间更新问题,但是要注意的是题中所给数据范围庞大,直接搞肯定会搞出问题,所 ...

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

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

  7. hdu 5692 Snacks(dfs序+线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...

  8. hdu 1698(线段树区间更新)

    解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...

  9. ZOJ 1610 Count the Colors (线段树区间更新)

    题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...

最新文章

  1. 考研结束了,使用SpringBoot开发一个考研管理系统
  2. 100多个基础常用JS函数和语法集合大全
  3. 基于DSP的数字振荡器C语言编程,基于DSP的数字振荡器的设计与实现.pdf
  4. mysql-mmm 集群高可用软件介绍
  5. 计算机基本概念及简单的二进制运算
  6. Python 读入Excel表时如何判空NaN
  7. 系统动力学模型_RCR新文:基于系统动力学模型的中国煤炭产能情景预测
  8. 减少工作时间更有利于百姓
  9. 家用nas的过去现在和未来--2008n年
  10. ASP.NET2.0 GridView小技巧汇粹 (转)
  11. 浅谈串口DCB流控制设置
  12. sqlserver实验心得体会_sql查询操作实验总结.docx
  13. Linux信号量常用操作表
  14. ZOJ 3551 Bloodsucker(概率)
  15. 等待事件:control file parallel write
  16. pythonembed版是什么意思_HTML中embed什么意思?有哪些作用?(附代码)
  17. github 本地 fatal: couldn‘t find remote ref master错误解决方案
  18. mysql建库、建表命令、sql语句大全
  19. java 代码 二义性是什么_Java接口默认方法带来的问题分析【二义性问题】
  20. linux c++读取excel文件的库

热门文章

  1. Python多处理示例
  2. ROS的学习(七)ROS的话题
  3. Java基础篇:if控制语句
  4. 一脸懵逼的算法系列之汉诺塔
  5. slider轮播插件的多种写法
  6. zabbix4.0.1中文乱码问题
  7. CentOS7中搭建cobbler自动装机服务
  8. 一:学习Linux前准备工作
  9. nginx发布静态目录备忘
  10. scala学习手记2 - scala中的循环