这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题。

线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点离散化的想法实现。(受到一个博客的启发)


  题意:贴海报-给出海报左右端点,然后顺序贴上,问最后有多少海报可见。

  直接贴上Code,具体解释在注释中有提及(有不懂的地方可以在纸上打个线段树草稿试试):

//贴海报-给出海报左右端点,顺序贴上,问最后有多少海报可见。
//Time:79Ms Memory:2712K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; #define MAX 10005 struct Node {
int l, r, kind;
}tr[16*MAX]; //两端点加空点需要8-16*MAX数据量 struct Pos {
int num, id;
friend bool operator < (Pos p1, Pos p2) { return p1.num < p2.num; }
}pos[2*MAX]; int n, cnt;
int l[MAX], r[MAX];
bool v[MAX]; void build(int x,int l,int r)
{
tr[x].l = l; tr[x].r = r;
if (l == r) return;
int mid = (l + r) / 2;
build(2 * x, l, mid);
build(2 * x + 1, mid + 1, r);
} void update(int x,int l,int r,int k)
{
if (tr[x].l == l && tr[x].r == r) {
tr[x].kind = k;
return;
}
if (tr[x].kind) {
tr[2 * x].kind = tr[x].kind;
tr[2 * x + 1].kind = tr[x].kind;
tr[x].kind = 0;
}
int mid = (tr[x].l + tr[x].r) / 2;
if (r <= mid) update(2 * x, l, r, k);
else if (l > mid) update(2 * x + 1, l, r, k);
else {
update(2 * x, l, mid, k);
update(2 * x + 1, mid + 1, r, k);
}
} int query(int x,int l,int r)
{
if (tr[x].kind) {
if (v[tr[x].kind]) return 0;
else { v[tr[x].kind] = true; return 1;}
}
if (tr[x].l == tr[x].r) return 0; //由于有空点,可能会有tr[x].kind = 0
int mid = (tr[x].l + tr[x].r) / 2;
return query(2 * x, l, mid) + query(2 * x + 1, mid + 1, r);
} int main()
{
int T;
scanf("%d", &T);
while (T--) {
memset(tr, 0, sizeof(tr));
memset(v, 0, sizeof(v));
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d%d", &l[i], &r[i]);
pos[2 * i].num = l[i];
pos[2 * i + 1].num = r[i];
pos[2 * i].id = 2 * i; //偶数-左端点
pos[2 * i + 1].id = 2 * i + 1; //奇数-右端点
}
int last = pos[0].num;
cnt = 1;
sort(pos, pos + 2 * n);
for (int i = 0; i < 2 * n; i++)
{
if (last != pos[i].num) {
if (pos[i].num - last > 1)
cnt++; //不相邻时,中间空一点
cnt++;
last = pos[i].num;
}
int id = pos[i].id; //分别对左右端点离散化
id % 2 ? r[id/2] = cnt : l[id/2] = cnt;
}
build(1, 1, cnt);
for (int i = 0; i < n; i++)
update(1, l[i], r[i], i + 1);
printf("%d\n", query(1, 1, cnt));
} return 0;
}

ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)的更多相关文章

  1. ACM/ICPC 之 数据结构-线段树思想(POJ2182,含O(n^2)插入式解法)

    这道题在一定程度上体现了线段树的一种用法,解决的问题是:对于总计n个元素的第i个元素,已知其在[1,i]上部分序列的排名,求第i个元素在所有n个元素中的排名. 当然这道题数据比较水,所以用O(n^2) ...

  2. 线段树区间离散化维护按秩合并并查集(可撤销)——牛客多校第八场E

    模板题..去网上学了可撤销的并查集.. /* 给定一个无向图,边的属性为(u,v,l,r),表示<u,v>可以通过的size为[l,r] 求出有多少不同的size可以从1->n 把每 ...

  3. ACM: Hotel 解题报告 - 线段树-区间合并

    Hotel Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description The ...

  4. 线段树区间离散化——牛客多校E

    这个区间离散化把我调死了.. 总之用vector来离散化,然后叶子节点维护的是一段区间,记录下每个叶子结点的起点+长度 千万要注意下标不能弄错! #include<bits/stdc++.h&g ...

  5. hiho1116 - 数据结构 线段树(区间合并)

    题目链接 现在有一个有n个元素的数组a1, a2, ..., an. 记f(i, j) = ai * ai+1 * ... * aj. 初始时,a1 = a2 = ... = an = 0,每次我会修 ...

  6. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  7. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  8. POJ 2528 Mayor's posters (线段树区间更新+离散化)

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

  9. POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

随机推荐

  1. 跳出iframe

    摘要 有时候需要用到iframe,但里面的单击里面的链接的时候,总是在该iframe中打开. 解决办法 其实解决起来也很简单. 在iframe中的head标签中添加下面的标签即可. <base ...

  2. 【转】apache kafka监控系列-KafkaOffsetMonitor

    apache kafka监控系列-KafkaOffsetMonitor 时间 2014-05-27 18:15:01  CSDN博客 原文  http://blog.csdn.net/lizhitao ...

  3. html 补充

    替换文本属性(Alt)alt 属性用来为图像定义一串预备的可替换的文本.替换文本属性的值是用户定义的.<img src="boat.gif" alt="Big Bo ...

  4. 微信连wifi正式全量对外开放申请 升级智能服务

    之前我们提到过微信公众平台"微信连Wi-Fi"功能来了,昨日,微信连Wi-Fi自助申请入口正式全量对外开放(独立申请入口https://wifi.weixin.qq.com/),意 ...

  5. Redis的一些坑

    转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团 ...

  6. WPF:类型转换器的实现

    类型转换器提供字符串文本到值的转换方法来帮助WPF设计时在XAML中配置属性.具体用法可以参考MSDN的文档:如何:实现类型转换器. 下面是一个Demo,参考自<葵花宝典--WPF自学手册> ...

  7. 在使用开源library的PullToRefreshView中

    下拉刷新几乎是每个应用都会有的功能,且大部分用的都是开源项目,下载地址:下拉刷新.如何在页面刚打开的时候自动触发下拉刷新的呢? 只需要一句代码,在PullToRefreshAdapterView Ba ...

  8. JVM内存监控工具 Jconsole

    -------------Jconsole监视远程的linux服务器上的tomcat ----------------------------- 1.linux服务器上的tomcat 的bin/cat ...

  9. tokudb

    经测试,tokudb 的事务会锁表,不管有没有用到索引,触发器也会锁表,(可能触发器和事务的原理是一样的吧).innodb 只会锁行. 竟然把这么坑的数据库用到线上来了,这下坑爹了.

  10. 如何将jsp页面的table报表转换到excel报表导出

    假设这就是你的jsp页面: 我们会添加一个“导出到excel”的超链接,它会把页面内容导出到excel文件中.那么这个页面会变成这个样子 在此,强调一下搜索时关键词的重要性,这样一下子可以定位到文章, ...