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

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


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

  直接贴上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. java.lang.reflect.Field

    java.lang.reflect.Field 一.Field类是什么 Field是一个类,位于java.lang.reflect包下. 在Java反射中 Field类描述的是 类的属性信息,通俗来讲 ...

  2. Java当中的内存分配以及值传递问题内存解析

    首先必须说明作为Java程序员对于内存只要有大致的了解就可以了,如果你对Java当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把 ...

  3. 一个简单的html5页面在线速成工具!(当然本文主要说下他的成果的结构)

    分享一个好玩的web app页面速成工具 当然主要是让大家看下他的原理 看着他的结构大家就该猜到这个了.这个是利用换页之后给当前div加了一个active,然后利用css控制效果 这个毫无疑问是采用最 ...

  4. linq学习

    最全的linq学习文章: http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html

  5. HtmlAgilityPack解析器在WP8.1下报错,不仅如此,社交化分享也报错。

    以前WP7下是用的HtmlAgilityPack和 XPath来解析网页,很好用. 但是在Wp8.1下,这个里面却缺少了一个很重要的方法. HtmlDocument doc = new HtmlDoc ...

  6. nyoj 14 会场安排问题(贪心专题)java

    会场安排问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工 ...

  7. 移除wordpress留言中自动链接功能

    默认情况下,在 WordPress 博客的留言中含有 URL,会自动变成可点击的,虽然这样的链接是 nofollow 的,但是还是成为 SPAM 利用的对象,所以可以移除这个自动链接功能. 我们可以在 ...

  8. tc 147 2 PeopleCircle(再见约瑟夫环)

    SRM 147 2 600PeopleCircle Problem Statement There are numMales males and numFemales females arranged ...

  9. Mac Mini中添加VNC访问

    开启Mac Mini上面的VNC. 1) 打开“系统偏好设置”(System Preference),双击打开“共享”(Sharing)项. 2)在左侧将“屏幕共享”(Screen sharing) ...

  10. Hello 畅连·西瓜 帮助与更新

    无感认证很好用,软件不再更新, 感谢每一位朋友的陪伴,谢谢! (2016.12.15) 百度云:点击下载 ------------旧版更新日志------------- Hello 畅连·西瓜 官网: ...