这个题非常有意思的地方是,我们发现区间[1,4]和[5,8]是紧挨着的,因为这个的数代表的是一段区间,原本我们对于普通的离散,

a[1]=1,a[2]=5,a[3]=6,a[4]=8;数组下标就是重新离散的位置,但是a[2]和a[3]明显不重叠,为此我们需要重新考虑离散的内容,其实不妨这样,如果区间的间隔大于1,那么我们插入一个数a[i]+1,这样就强行把a[i]和a[i+1]分开,因为

如三张海报为:1~10 1~4 6~10

离散化时 X[ 1 ] = 1, X[ 2 ] = 4, X[ 3 ] = 6, X[ 4 ] = 10
第一张海报时:墙的1~4被染为1;
第二张海报时:墙的1~2被染为2,3~4仍为1;
第三张海报时:墙的3~4被染为3,1~2仍为2。
最终,第一张海报就显示被完全覆盖了,于是输出2,但实际上明显不是这样,正确输出为3。

新的离散方法为:在相差大于1的数间加一个数,例如在上面1 4 6 10中间加5(算法中实际上1,4之间,6,10之间都新增了数的)

为什么会这样呢?我们这样考虑,如果a[1]=3,a[2]=4那么他们两个是相邻的,这样其实离散后他们还是相邻的(因为1,2在题目的意义是相邻的),但是如果是a[1]=3,a[2]=5哈希后其实是(1,2) 它是相邻的(实际上3,5不相邻),于是我们想到这样,既然我们中间有一段(没有数那一段)是我们所忽略的,我们可以新加一个数4,如

a[1]=3    a[2]=4   a[3]=5; 这样哈希后是1,2,3,我们认为3->1而5->3,(1,3)其实是不相邻的。这道题也就没什么问题了,最后区间查询+区间修改。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<string.h>
  5. using namespace std;
  6. const int maxn = ;
  7. int sum[maxn<<];
  8. int vis[maxn<<];
  9. int li[maxn*];
  10. int ri[maxn*];
  11. int lsh[maxn<<];
  12. void pushdown(int root){//把节点信息传给儿子节点
  13. sum[root<<]=sum[root];//相应这个节点如果最后被修改成这个结果,那么他的儿子节点也应该修改
  14. sum[root<<|]=sum[root];
  15. sum[root]=-;//清空laze标记
  16. }
  17. int ans;
  18. void update(int root,int L,int R,int C,int l,int r){
  19. if (L<=l && r<=R)//如果被修改区间完全盖过当前区间
  20. {
  21. sum[root]=C;//更新
  22. return;
  23. }
  24. if (sum[root]!=-)
  25. pushdown(root);//如果不满足上述条件,我们需要把节点的信息更新,
  26. int m=(l+r)>>;
  27. if (m>=R)update(root<<,L,R,C,l,m);//信息完全在左子树
  28. else if(L>m)update(root<<|,L,R,C,m+,r);//完全在右子树
  29. else update(root<<,L,m,C,l,m),update(root<<|,m+,R,C,m+,r);
  30. }
  31. void query(int root,int l,int r){
  32. // cout<<root<<endl;
  33. if (sum[root]!=- && !vis[sum[root]])//如果当前节点的信息已经能包含所有的节点信息,并且这个节点的信息是第一次访问到
  34. {
  35. ans++;
  36. vis[sum[root]]=;
  37. return;
  38. }
  39. if (l==r)
  40. {
  41. return;
  42. }
  43. if (sum[root]!=-)
  44. pushdown(root);//更新标记
  45. int m=(l+r)/;
  46. query(root<<,l,m);
  47. query(root<<|,m+,r);
  48. }
  49. int main(){
  50. int t;
  51. int n;
  52. scanf("%d",&t);
  53. while(t--){
  54. scanf("%d",&n);
  55. memset(sum,-,sizeof(sum));
  56. memset(vis,,sizeof(vis));
  57. int tot=;
  58. for (int i=;i<n;i++)
  59. {
  60. scanf("%d%d",&li[i],&ri[i]);
  61. lsh[tot++]=li[i];
  62. lsh[tot++]=ri[i];
  63. }
  64. sort(lsh,lsh+tot);
  65. int mm=unique(lsh,lsh+tot)-lsh;
  66. int tt=mm;
  67. for (int i=;i<tt;i++)
  68. {
  69. if (lsh[i]-lsh[i-]>)
  70. lsh[mm++]=lsh[i-]+;
  71. }
  72. sort(lsh,lsh+mm);//排序 按照数组下标进行离散
  73. for (int i=;i<n;i++){
  74. int x=lower_bound(lsh,lsh+mm,li[i])-lsh;//查找左边的离散后的号码
  75. int y=lower_bound(lsh,lsh+mm,ri[i])-lsh;//查找右边的离散后的号码
  76. update(,x,y,i,,mm-);//更新
  77. }
  78. ans=;
  79. query(,,mm-);
  80. printf("%d\n",ans);
  81. }
  82. return ;
  83. }

POJ - 2528 区间离散化,线段树区间修改,区间询问的更多相关文章

  1. xdoj-1324 (区间离散化-线段树求区间最值)

    思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i]  覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...

  2. POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】

    任意门:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  3. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. BZOJ4653(区间离散化+线段树+决策单调尺取)

    写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除.然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按 ...

  6. [Noi2016]区间[离散化+线段树维护+决策单调性]

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 621  Solved: 329[Submit][Status][D ...

  7. poj 2528 poster经典线段树+lazy+离散化

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; #def ...

  8. Lightoj 1348 Aladdin and the Return Journey (树链剖分)(线段树单点修改区间求和)

    Finally the Great Magical Lamp was in Aladdin's hand. Now he wanted to return home. But he didn't wa ...

  9. I Hate It HDU - 1754 线段树 单点修改+区间最值

    #include<iostream> #include<cstring> using namespace std; ; int m,n,p; struct node{ int ...

  10. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

随机推荐

  1. IIS ip访问限制插件

    Dynamic IP Restrictions Overview The Dynamic IP Restrictions Extension for IIS provides IT Professio ...

  2. css属性总结

    前言 有些属性不是很常用,但是工作中遇到了,记录一下,方便学习. 1.text-indent text-indent 属性规定文本块中首行文本的缩进.主要实现就像word那种首行缩进的效果. 详解ht ...

  3. 一套简单的git版本控制代码

    对于博客来说,我还是直接实践比较好,理论过多,不方便以后的查看 废话不多,直接开干 功能需求: .公司需要将jenkins打包出来的压缩包通过git上传到git服务器 .而且通过版本控制上传的文件,即 ...

  4. 转:修改IIS虚拟目录名称bat脚本

    @echo off echo ------------------------------------------------------------------------------ echo - ...

  5. 转:Redis 使用经验总结

    转自:Redis 总结精讲 看一篇成高手系统-4 本文围绕以下几点进行阐述 1.为什么使用redis2.使用redis有什么缺点3.单线程的redis为什么这么快4.redis的数据类型,以及每种数据 ...

  6. python3爬虫抓取智联招聘职位信息代码

    上代码,有问题欢迎留言指出. # -*- coding: utf-8 -*- """ Created on Tue Aug 7 20:41:09 2018 @author ...

  7. echo 在shell及脚本中显示色彩及闪烁警告效果

    在shell脚本编写中,echo用于输出字符串等提示信息,当我们需要格外显示色彩及闪烁效果如下: 一.在执行shell中显示色彩: 语法格式: echo -e "\033[颜色1:颜色2m ...

  8. MC9SD64单片机快速入门 I/O寄存器

    I/O的使用 数据方向寄存器和数据寄存器的配置 I/O输入输出的使用: 数据方向寄存器与数据寄存器 寄存器的概念: 寄存器,是集成电路中非常重要的一种存储单元,通常由触发器组成.在集成电路设计中,寄存 ...

  9. 【算法】LeetCode算法题-Length Of Last Word

    这是悦乐书的第155次更新,第157篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第14题(顺位题号是58).给定一个字符串,包含戴尔字母.小写字母和空格,返回最后一个单 ...

  10. Nginx使用教程(二):Nginx配置性能优化之worker配置

    配置Nginx workers <br\>NGINX根据指定的配置运行固定数量的工作进程. 这些工作进程负责处理所有处理. 在下面的章节中,我们将调整NGINX worker参数. 这些参 ...