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

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


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

  直接贴上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. 离屏渲染学习笔记 /iOS圆角性能问题

    离屏渲染学习笔记 一.概念理解 OpenGL中,GPU屏幕渲染有以下两种方式: On-Screen Rendering 意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行. O ...

  2. android自定义控件(8)-利用onMeasure测量使图片拉伸永不变形,解决屏幕适配问题

    使用ImageView会遇到的问题 在Android应用中,都少不了图片的显示,ImageView,轮播图,ViewPager等等,很多都是来显示图片的,很多时候,我们都希望图片能够在宽度上填充父窗体 ...

  3. C语言之strrchr函数

    from:http://blog.csdn.net/hgj125073/article/details/8443912 [FROM MSDN && 百科] 原型:char *strrc ...

  4. 谈谈我眼中的CSDN吧

    昨天逛博客园看到了这篇曝光率很高的文章:博客搬家——从CSDN到博客园,一篇短短的文章竟然招致这么多人的讨论,可能程序员就喜欢“Java好还是PHP好”这类型的问题吧,好无聊.由于我一直在使用CSDN ...

  5. 再谈 X-UA-Compatible 兼容模式

    如何理解 IE 的文档兼容模式(X-UA-Compatible)? IE 浏览器支持多种文档兼容模式,得以因此改变页面的渲染效果. IE9 模式支持全范围的既定行业标准,包括 HTML5(草案), W ...

  6. WCF--验证码实现...

    未开始待续... 未完待续...

  7. Request 传值 遇到的中文乱码问题

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="xxxx.aspx.cs&quo ...

  8. CF #305(Div.2) D. Mike and Feet(数学推导)

    D. Mike and Feet time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  9. js验证姓名和身份证号

    js验证真实姓名,是用的unicode字符的来进行匹配,而中国人的姓名长度一般都是2-4,所以重复匹配{2,4}次 1.js验证真实姓名 1 var regName =/^[\u4e00-\u9fa5 ...

  10. cpu利用率和cpu 队列

    SIP的第四期结束了,因为控制策略的丰富,早先的的压力测试结果已经无法反映在高并发和高压力下SIP的运行状况,因此需要重新作压力测试.跟在测试人员后面做了快一周的压力测试,压力测试的报告也正式出炉,本 ...