[BZOJ 3888] [Usaco2015 Jan] Stampede 【线段树】
题目链接: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 【线段树】的更多相关文章
- [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)
[BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
- 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][ ...
- BZOJ3888 [Usaco2015 Jan]Stampede
我们只要把每头牛开始遮挡视线和结束遮挡视线的时间点都搞出来就好= = 再按照y轴排序...然后变成线段覆盖了..线段树搞一下就好了? /******************************** ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)
BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...
- BZOJ.4399.魔法少女LJJ(线段树合并)
BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...
- BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)
BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...
- zoj 3888 Twelves Monkeys 二分+线段树维护次小值
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemCode=3888 Twelves Monkeys Time Limit: 5 ...
随机推荐
- linux中的网络通信指令 分类: 学习笔记 linux ubuntu 2015-07-06 16:02 134人阅读 评论(0) 收藏
1.write write命令通信是一对一的通信,即两个人之间的通信,如上图. 效果图 用法:write <用户名> 2.wall wall指令可将信息发送给每位同意接收公众信息的终端机用 ...
- iOS 网络编程:socket
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- springmvc使用@ResponseBody返回json乱码解决方法
1.springmvc 3.2以上的版本解决乱码的方法: 第一步:在配置中加入: <mvc:annotation-driven> <mvc:message-converters re ...
- get方式请求会出现中文乱码。post方式不会。
get方式请求会出现中文乱码.post方式不会. 如果是要解决get方式中文乱码问题,就需要做一个拦截器,或者在web.xml做一个get请求的配置 来自为知笔记(Wiz)
- SQL多行拼接为一行
使用简单T-SQL,拼接一列多行为一行.按SQL SERVER的说法叫做自拼接(PS:区分自连接) 还有一种方法是for xml path的方式,感觉不实用. declare @Result varc ...
- IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET
转载至码农SeraphWU IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET 进入CMD 输入如下命令即可 "%WINDIR%\Microsoft.NET\Framework\ ...
- LINQ数据库连接对象制造工厂
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 初学HTML5系列二:HTML5新增的事件属性
Window事件属性: 属性 值 描述 onafterprint script 文档打印之后运行的脚本. 属性发生于用户设置页面打印并且打印对话框已出现之后. onbeforeprint scri ...
- hibernate - 何时关闭数据库
ref: http://www.coderanch.com/t/637103/ORM/databases/close-database-connection-hibernate 我上这个问题, 原因是 ...
- MORE ABORT AWR?
For some time, Oracle’s solution in this area has been its built-in tool, Statspack.Oracle Database ...