还是做了线段树的题目,玩了两天也要继续看看题目了。之前就有看离散化的概念,大家可以去百度百科一下,简单转载一个例子

离散化 的大概思路 : 比如说给你一组 数据 1 4 1000 100000, 如果直接
开线段, 显然是浪费, 那么我们只要 进行 映射 :
1                   1
4                   2
1000              3
100000          4
接下来 我们只要对 1 2 3 4 建立线段树就行了 只需要[1,4]的区间。

差不多就是这样了,这样就可以大大减少使用的内存空间。

这道题目的数据范围非常大1 <= li <= ri <= 10000000;直接开肯定爆掉的,而且光建树就浪费非常多的时间了,所以做离散化映射。因为1 <= n <= 10000,所以建树开四倍大空间就行,又以为一个输入数据两个点,所以是八倍空间。本题重点是离散化的使用,记得之前比赛题目就是这题,那时候还不会线段树,就无限尝试一直WA,现在终于解决了。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include<algorithm>
using namespace std;
struct NODE
{
    int l,r,val;
}tree[80005];
struct node
{
 int l,r;
}num[10001];
bool vis[10001];
int ans,lag[20001],n;
void build(int l,int r,int index)   //建树
{
    tree[index].l=l;
    tree[index].r=r;
 tree[index].val=0;
    if(l==r)
        return;
 int mid=(l+r)/2;
 build(l,mid,2*index);
 build(mid+1,r,2*index+1);
}
int find(int x)              //二分查找对应点
{
 int l=0,r=n-1;
 while(l<=r)
 {
  int mid=(l+r)/2;
  if(lag[mid]==x)
   return mid+1;
  else
   if(lag[mid]>x)
   r=mid-1;
  else
   l=mid+1;
 }
}
void update(int l,int r,int index,int c)         //更新线段树,标记属于哪个宣传
{
    if(l==tree[index].l && r==tree[index].r)
    {
        tree[index].val=c;
        return;
    }
 if(tree[index].val>-1)
 {
  tree[2*index].val=tree[2*index+1].val=tree[index].val;
  tree[index].val=-1;
 }
 int mid=(tree[index].l+tree[index].r)/2;
    if(mid>=l && mid+1<=r)
 {
  update(l,mid,2*index,c);
        update(mid+1,r,2*index+1,c);
 }
    else
  if(r<=mid)
        update(l,r,2*index,c);
    else
  if(l>=mid+1)
        update(l,r,2*index+1,c);
}
void query(int l,int r,int index)            
{
    if(tree[index].val>-1)           //询问的核心     满足条件的情况
 {
  int tc=tree[index].val;
  if(!vis[tc] && tc)
  {
   vis[tc]=1;
   ans++;
  }
  return;
 }
    int mid=(tree[index].l+tree[index].r)/2;
    if(l<=mid && r>=mid+1)
 {
  query(l,mid,2*index);
  query(mid+1,r,2*index+1);
 }
    else
  if(r<=mid)
        query(l,r,2*index);
    else
  if(l>=mid+1)
        query(l,r,2*index+1);
}
int main()
{
    int i,t,N,pre,l,r;
    scanf("%d",&t);
 while(t--)
 {
  memset(vis,0,sizeof(vis));
  scanf("%d",&N);
  for(i=0;i<N;i++)               //输入数据做映射
  {
   scanf("%d%d",&num[i].l,&num[i].r);
   lag[2*i]=num[i].l;
   lag[2*i+1]=num[i].r;
  }
  sort(lag,lag+2*N);
  n=pre=0;
  for(i=0;i<2*N;i++)      //去除相同数据
  {
   if(lag[i]!=pre)
   {
    pre=lag[i];
    lag[n++]=lag[i];
   }
  }
  build(1,n,1);
  for(i=0;i<N;i++)         //开始一个个点的更新
  {
   l=find(num[i].l);
   r=find(num[i].r);
   update(l,r,1,i+1);
  }
  ans=0;
  query(1,n,1);
  printf("%d\n",ans);
 }
 return 0;
}

转载于:https://www.cnblogs.com/littlex/archive/2012/02/04/2337970.html

POJ 2528 Mayor's posters (离散化和线段树使用)相关推荐

  1. POJ 2528 Mayor's posters 贴海报 线段树 区间更新

    注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...

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

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

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

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

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

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

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

    Mayor's posters https://vjudge.net/problem/POJ-2528#author=szdytom 线段树 + 离散化 讲解:https://blog.csdn.ne ...

  6. poj 2528 Mayor's posters(线段树 离散化 区间更新 贴海报)

         这个题目本来对大神来说可能是水题, 对我就不行了,昨晚非折腾到下半夜一点 搞定, 并且可以总结出 ,只有把问题想清楚,或着看人家解题报告自己把问题和代码思路 搞清楚,才能谈的上调bug,否则 ...

  7. POJ - 2528 Mayor's posters(线段数+离散化)

    题目链接:点击查看 题目大意:给定一个长度为1e7的墙,然后给出n张海报,每张海报都会占据墙上的一部分宽度,问按照给出的次序往墙上贴海报, 最后有几张海报能露出来(露出部分也算) 题目分析:线段树的区 ...

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

    /*离散化+线段树由于 数据的输入最大是 10000000 ,直接用开数组肯点会超,所以要将起离散话,首先 ,我们存储输入的边,将其离散化,后面的就和一般的线段树一样可. */#include< ...

  9. POJ - 2528 Mayor's posters (浮水法+线段树/离散化+线段树)

    题目链接 题意: n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 分析1 离散 ...

最新文章

  1. SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决
  2. 趣味编程:函数式链表的快速排序
  3. 来,带你鸟瞰 Java 中的并发框架!
  4. 分区和分片的区别_MySQL分区与分片的差异
  5. STM32F0xx_SPI读写(Flash)配置详细过程
  6. 在Docker中运行asp.net core 跨平台应用程序
  7. Java 删除集合中指定的元素
  8. gdb调试bin带参数
  9. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_17-页面静态化-模板管理-GridFS研究-存文件...
  10. mouseover和mouseenter的区别?
  11. 浑水摸「YY」、「侠盗」苹果和辛巴的「麦乳精」|极客一周
  12. 渗透测试实习日记day1
  13. 二元二次方程例题_二元二次方程组 解法 例题精编版
  14. python re 替换_python字符串替换之re.sub()
  15. html tr行内样式左对齐,探索CSS单行文字居中,多行文字居左的实现方式
  16. 奇妙的裴波那契数列和黄金分割
  17. keil创建无启动文件及自定义.sct文件的工程
  18. 【BLE MESH】PB-ADV入网详解
  19. LTE与VOLTE基础知识(1)
  20. 测试开发 | 接口测试之HTTP 协议讲解

热门文章

  1. scala 模式匹配支持正则吗_Python3正则表达式——小白初学!最完整的教程没有之一...
  2. 远程桌面漏洞poc_【漏洞复现】CVE 2019-0708 漏洞利用
  3. php tesseract,PHP ocr:用Tesseract OCR进行文字识别
  4. 人人网 api2.0 java_API2.0文档
  5. 检查java_如何检查Java版本?
  6. java okhttp设置超时_Java OkHttpClient.setWriteTimeout方法代码示例
  7. vm虚拟机win10无法复制文件_远程桌面无法复制粘贴传输文件解决办法
  8. mysql查询无主键的表的方法:
  9. 学习笔记(07):MySQL数据库运维与管理-02-用户权限授予演示
  10. retrofit框架学习(二)----retrofit封装