这个题非常有意思的地方是,我们发现区间[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. CentOS 6.5 安装mysql 过程记录

    下载的时候一定选对应的版本, el6 还是el7 或者其他版本,不然会出现意向不到的惊喜 比如:我刚开始的时候下载的 el7 版本的 mysql , 然后安装的时候 就会出现: libc.so.(GL ...

  2. python中封装、继承、多态

    又看到这个玩意,顺手写下来 面向对象三大特征: 封装:本质是将事物相关的属性和方法封装在一个类里面,我们调用类创建实例的时候,不用关心类内部的代码细节 继承:子类需要复用父类里面的属性或者方法,当然子 ...

  3. 关于.NET字符串驻留的问题

    默认情况下,CLR会把字符串常量保存在字符串池中..NET 2.0引入了CompilationRelaxations.NoStringInterning枚举成员.这个枚举CompilationRela ...

  4. linux ubuntu 关于vim得一些基本命令

    1.vim显示行号 :set number 2. 快捷键 J 向下 K 往上 H 向左 L 向右 ctrl+shift+T 打开新窗口 ctrl+Page Down 所有vim窗口向下切换 ctrl+ ...

  5. Ubuntu下使用终端ssh访问设置了密钥的云服务器

    首先先安装OpenSSH客户端,可以直接apt-get安装 sudo apt-get install openssh-server 然后将私钥权限修改为600 chmod 600 keyfile 最后 ...

  6. layui form.on('select(xxx)',function(){});绑定失败

    使用layui的form.on绑定select选中事件中, form.on()不执行, 主要原因有 1, select标签中没有写lay_filter属性,用来监听 <select id=&qu ...

  7. C3P0连接池温习1

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  8. 从Hadoop到Spark的架构实践

    当下,Spark已经在国内得到了广泛的认可和支持:2014年,Spark Summit China在北京召开,场面火爆:同年,Spark Meetup在北京.上海.深圳和杭州四个城市举办,其中仅北京就 ...

  9. 自适应:用JS做的自适应,是最差的自适应,记页面刷新前后尺寸变化

    今天遇到一个硬茬,我在使用weui重构一个页面时,出现一个问题:路由进入页面时,页面内容尺寸硬是会变大,刷新后又恢复正常: 项目背景:一个使用react-starter-kit构建的B端SPA项目 上 ...

  10. Android自动登录功能的实现

    登陆页面布局设计: <LinearLayout android:layout_width="wrap_content" android:layout_height=" ...