题目链接:BZOJ - 3888

题目分析

首先,计算出每个线段在 x 坐标 0 处出现的时间开始点和结束点,就转成了时间轴上的线段。

然后就是看每条线段是否被 y 比它小的线段完全覆盖了。注意求出的时间点要离散化,然后应该使用时间轴上的区间来表示,两线段端点重合并不是有共同部分。

将所有线段按照 y 从小到大排序之后,使用线段树判断它覆盖的区间是否已经都被前面的线段覆盖了。

然后将它所覆盖的区间覆盖。

就这样的一道题我WA了7次,还有救吗..

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map> using namespace std; const int MaxN = 100000 + 5; map<int, int> M; int n, Top, Ans, MN;
int NA[MaxN], T[MaxN * 4], D[MaxN * 4]; inline int gmin(int a, int b) {return a < b ? a : b;} struct ES
{
int s, t, Height;
} E[MaxN]; inline bool Cmp(ES e1, ES e2)
{
return e1.Height < e2.Height;
} inline void Paint(int x)
{
T[x] = D[x] = 1;
} inline void PushDown(int x)
{
if (D[x] == 0) return;
Paint(x << 1);
Paint(x << 1 | 1);
D[x] = 0;
} int Get(int x, int s, int t, int l, int r)
{
if (l <= s && r >= t) return T[x];
PushDown(x);
int m = (s + t) >> 1, ret = 1;
if (l <= m) ret = gmin(ret, Get(x << 1, s, m, l, r));
if (r >= m + 1) ret = gmin(ret, Get(x << 1 | 1, m + 1, t, l, r));
return ret;
} inline void Update(int x)
{
T[x] = gmin(T[x << 1], T[x << 1 | 1]);
} void Cover(int x, int s, int t, int l, int r)
{
if (l <= s && r >= t)
{
Paint(x);
return;
}
PushDown(x);
int m = (s + t) >> 1;
if (l <= m) Cover(x << 1, s, m, l, r);
if (r >= m + 1) Cover(x << 1 | 1, m + 1, t, l, r);
Update(x);
} int main()
{
scanf("%d", &n);
int x, y, r;
for (int i = 1; i <= n; ++i)
{
scanf("%d%d%d", &x, &y, &r);
E[i].Height = y;
E[i].s = (-x - 1) * r;
E[i].t = E[i].s + r;
NA[++Top] = E[i].s;
NA[++Top] = E[i].t;
}
sort(NA + 1, NA + Top + 1);
int p = 0;
for (int i = 1; i <= Top; ++i)
{
if (i != 1 && NA[i] == NA[i - 1]) continue;
M[NA[i]] = ++p;
}
for (int i = 1; i <= n; ++i)
{
E[i].s = M[E[i].s];
E[i].t = M[E[i].t] - 1;
}
sort(E + 1, E + n + 1, Cmp);
MN = n * 2 + 5;
for (int i = 1; i <= n; ++i)
{
if (Get(1, 1, MN, E[i].s, E[i].t) == 0) ++Ans;
Cover(1, 1, MN, E[i].s, E[i].t);
}
printf("%d\n", Ans);
return 0;
}

  

[BZOJ 3888] [Usaco2015 Jan] Stampede 【线段树】的更多相关文章

  1. [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)

    [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...

  2. [BZOJ 2653] middle(可持久化线段树+二分答案)

    [BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...

  3. bzoj 1537: [POI2005]Aut- The Bus 线段树

    bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...

  4. BZOJ3888 [Usaco2015 Jan]Stampede

    我们只要把每头牛开始遮挡视线和结束遮挡视线的时间点都搞出来就好= = 再按照y轴排序...然后变成线段覆盖了..线段树搞一下就好了? /******************************** ...

  5. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  6. BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)

    BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...

  7. BZOJ.4399.魔法少女LJJ(线段树合并)

    BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...

  8. BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)

    BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...

  9. zoj 3888 Twelves Monkeys 二分+线段树维护次小值

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemCode=3888 Twelves Monkeys Time Limit: 5 ...

随机推荐

  1. PCAP 文件内容解析命令

    针对网络接口.端口和协议的数据包截取.假定你要截取网络接口eth1,端口号6881的tcp数据包.数据文件保存为test.pcap. tcpdump -w test.pcap -i eth1 tcp ...

  2. kafka Windows客户端Linux服务器---转

    原文:http://blog.csdn.net/jingshuigg/article/details/25001979 一.对于服务器端的搭建可以参考上一篇文章:kafka单机版环境搭建与测试 服务器 ...

  3. Unity monodev环境搭建

    断点调试功能可谓是程序员必备的功能了.Unity3D支持编写js和c#脚本,但很多人可能不知道,其实Unity3D也能对程序进行断点调试的.不过这个断点调试功能只限于使用Unity3D自带的MonoD ...

  4. linux sed使用

    原文引用:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html [root@www ~]# sed [-nefr] [动作] ...

  5. Maven浅析-2 什么是Maven

    1.简单点讲:Maven就是一个项目构建工具.它可以生成一个artifact(component),还可以帮我们管理项目依赖(如附加的组件Filters等). 2.从整体讲:Maven也可以看作一个项 ...

  6. CSS伪类选择器和伪元素选择器

    CSS的伪类选择器常用的是link/visited/hover/active,分别对应未访问.已访问过.鼠标悬停.鼠标按下时的样式,常用于链接,使用时要按此顺序依次写CSS,不能乱 a:link{ba ...

  7. JAVA 循环在一个数字前面填充0.小例子

    输入结果 00000000000567 String bala="567"; 固定长度是14位,怎么循环在bala前面填充00000000000 System.out.printl ...

  8. NFC手机

    NFC手机 NFC手机内置NFC芯片,比原先仅作为标签使用的RFID更增加了数据双向传送的功能,这个进步使得其更加适合用于电子货币支付:特别是RFID所不能实现的,相互认证和动态加密以及一次性钥匙(O ...

  9. MySQL全文检索笔记 转载

    1. MySQL 4.x版本及以上版本提供了全文检索支持,但是表的存储引擎类型必须为MyISAM,以下是建表SQL,注意其中显式设置了存储引擎类型 CREATE TABLE articles ( id ...

  10. ES的安装运行

    一.安装,运行 1. 检查java的版本环境 Elasticsearch依赖Java,在书写本文档的时候,推荐使用Oracle JDK 1.8.0_20 或 1.7.0_55以后的版本. 在安装Ela ...