题目链接: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. APUE 读书笔记 -----孤儿进程与僵尸进程[总结] +数据结构+C

    http://www.cnblogs.com/Anker/p/3271773.html

  2. Java 授权内幕--转载

    在信息安全性领域,授权是世界的的中心,因为它是控制个体(即人.进程和计算机)对系统资源的访问权限的过程.直到最近,在 Java 安全体系结构中相关的问题都是“这段运行中的代码的访问权限是什么?” 随着 ...

  3. oracle设定用户密码使用时间

    强制用户定期更换密码,要怎么设置? 假设密码用10天之后必须修改,宽限期为2天: 把电脑时间往后调十天,然后登录: 系统提示用户密码两天内失效,这时把电脑系统再往后调两天,然后登录: 系统提示密码已经 ...

  4. Windows Server 2008 R2中关闭“IE增强的安全配置”

    当在Windows Sever 2008 R2中运动IE8的时候会发现默认情况下IE启用了增强的安全配置,为了方便而且是在内网的情况下我们可以关闭IE8的增强安全配置,操作很简单如下步骤. 一,以本机 ...

  5. eclipse同时开两个tomcat

    首先设置环境变量: 接着修改其中一个tomcat下bin文件夹的startup.bat和catalina.bat 将里面所有CATALINA_HOME都修改为CATALINA_HOME2 然后 修改c ...

  6. Python教程:连接数据库,对数据进行增删改查操作

    各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解 和python基础知识之上 ...

  7. VM的Linux CentOS系统的VMTools的手动安装

    VM的Linux CentOS系统的VMTools的手动安装 一是没时间安装,另外是一直用的是VM的绿色版,里面没有Linux.iso 文件 今天晚上安装上了 linux 的vmtools ,再也不用 ...

  8. 24、Javascript BOM

    BOM(Browser Object Model)浏览器对象模型,一组浏览器提供的API. window对象 window对象表示当前浏览器的窗口,是Javascript的顶级对象,所有创建的对象.函 ...

  9. enableEventValidation

    回发或回调参数无效.在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEve ...

  10. SqlServer中的merge操作,相当地风骚

    今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有洞天,原来是另外一个sql关键字,t-sql的语法 ...