我们只要把每头牛开始遮挡视线和结束遮挡视线的时间点都搞出来就好= =

再按照y轴排序。。。然后变成线段覆盖了。。线段树搞一下就好了?

  1. /**************************************************************
  2. Problem: 3888
  3. User: rausen
  4. Language: C++
  5. Result: Accepted
  6. Time:1204 ms
  7. Memory:22684 kb
  8. ****************************************************************/
  9.  
  10. #include <cstdio>
  11. #include <algorithm>
  12.  
  13. using namespace std;
  14. const int N = 1e5 + ;
  15.  
  16. struct data {
  17. int x, y, c;
  18. int st, ed;
  19.  
  20. inline void read() {
  21. scanf("%d%d%d", &x, &y, &c);
  22. x *= -, st = c * (x - ), ed = st + c;
  23. }
  24.  
  25. inline bool operator < (const data &p) const {
  26. return y > p.y;
  27. }
  28. } a[N];
  29.  
  30. struct seg_node {
  31. seg_node *ls, *rs;
  32. int v;
  33. } *seg_null, *seg_root, mempool[N << ], *cnt_seg = mempool;
  34.  
  35. int n, ans;
  36. int v[N];
  37. int t[N << ], tot;
  38.  
  39. #define Ls p -> ls
  40. #define Rs p -> rs
  41. #define V p -> v
  42. #define mid (l + r >> 1)
  43. inline void seg_get_null(seg_node *&p) {
  44. p = cnt_seg, Ls = Rs = p;
  45. }
  46.  
  47. inline void seg_new(seg_node *&p) {
  48. p = ++cnt_seg, *p = *seg_null;
  49. }
  50.  
  51. inline void seg_push(seg_node *p) {
  52. if (V) {
  53. Ls -> v = Rs -> v = V;
  54. V = ;
  55. }
  56. }
  57.  
  58. inline void seg_build(seg_node *&p, int l, int r) {
  59. seg_new(p);
  60. if (l == r) return;
  61. seg_build(Ls, l, mid), seg_build(Rs, mid + , r);
  62. }
  63.  
  64. inline void seg_modify(seg_node *p, int l, int r, int L, int R, int v) {
  65. if (L <= l && r <= R) {
  66. V = v;
  67. return;
  68. }
  69. seg_push(p);
  70. if (L <= mid) seg_modify(Ls, l, mid, L, R, v);
  71. if (mid < R) seg_modify(Rs, mid + , r, L, R, v);
  72. }
  73.  
  74. inline int seg_query(seg_node *p, int l, int r, int pos) {
  75. if (l == r) return V;
  76. seg_push(p);
  77. if (pos <= mid) return seg_query(Ls, l, mid, pos);
  78. else return seg_query(Rs, mid + , r, pos);
  79. }
  80. #undef Ls
  81. #undef Rs
  82. #undef V
  83. #undef mid
  84.  
  85. int main() {
  86. int i;
  87. scanf("%d", &n);
  88. for (i = ; i <= n; ++i)
  89. a[i].read();
  90. sort(a + , a + n + );
  91. for (i = ; i <= n; ++i)
  92. t[i * - ] = a[i].st, t[i * ] = a[i].ed;
  93. sort(t + , t + * n + );
  94. tot = unique(t + , t + * n + ) - t;
  95. for (i = ; i <= n; ++i) {
  96. a[i].st = lower_bound(t + , t + tot + , a[i].st) - t;
  97. a[i].ed = lower_bound(t + , t + tot + , a[i].ed) - t;
  98. a[i].st *= , a[i].ed *= ;
  99. }
  100. tot *= ;
  101. seg_get_null(seg_null);
  102. seg_build(seg_root = seg_null, , tot);
  103. for (i = ; i <= n; ++i)
  104. seg_modify(seg_root, , tot, a[i].st, a[i].ed, i);
  105. for (i = ; i <= tot; ++i)
  106. v[seg_query(seg_root, , tot, i)] = ;
  107. for (ans = , i = ; i <= n; ++i)
  108. ans += v[i];
  109. printf("%d\n", ans);
  110. return ;
  111. }

BZOJ3888 [Usaco2015 Jan]Stampede的更多相关文章

  1. [BZOJ 3888] [Usaco2015 Jan] Stampede 【线段树】

    题目链接:BZOJ - 3888 题目分析 首先,计算出每个线段在 x 坐标 0 处出现的时间开始点和结束点,就转成了时间轴上的线段. 然后就是看每条线段是否被 y 比它小的线段完全覆盖了.注意求出的 ...

  2. 3890: [Usaco2015 Jan]Meeting Time( dp )

    简单的拓扑图dp.. A(i, j), B(i, j) 表示从点 i 长度为 j 的两种路径是否存在. 用bitset就行了 时间复杂度O(m) --------------------------- ...

  3. [补档][Usaco2015 Jan]Grass Cownoisseur

    [Usaco2015 Jan]Grass Cownoisseur 题目 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过? (一个点在路 ...

  4. BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur 【tarjan】【DP】*

    BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur Description In an effort to better manage the grazing pat ...

  5. bzoj3887: [Usaco2015 Jan]Grass Cownoisseur

    题意: 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) =>有向图我们 ...

  6. BZOJ_3887_[Usaco2015 Jan]Grass Cownoisseur_强连通分量+拓扑排序+DP

    BZOJ_3887_[Usaco2015 Jan]Grass Cownoisseur_强连通分量+拓扑排序+DP Description In an effort to better manage t ...

  7. [bzoj3887][Usaco2015 Jan]Grass Cownoisseur_trajan_拓扑排序_拓扑序dp

    [Usaco2015 Jan]Grass Cownoisseur 题目大意:给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在 ...

  8. BZOJ3886 : [Usaco2015 Jan]Moovie Mooving

    f[i]表示用i集合内的电影可以达到的最长时间 f[i]向f[i|(1<<j)]更新,此时的时间为第j部电影在f[i]前的最晚上映时间 先排序一遍离散化后用前缀最大值解决 时间复杂度$O( ...

  9. bzoj3890 [Usaco2015 Jan]Meeting Time

    Description Bessie and her sister Elsie want to travel from the barn to their favorite field, such t ...

随机推荐

  1. 利用CGLib实现动态代理实现Spring的AOP

    当我们用Proxy 实现Spring的AOP的时候, 我们的代理类必须实现了委托类的接口才能实现. 而如果代理类没有实现委托类的接口怎么办? 那么我们就可以通过CGLib来实现 package cn. ...

  2. RARP

    ARP的工作原理如下:1. 首先,每台主机都会在自己的ARP缓冲区 (ARP Cache)中建立一个 ARP列表,以表示IP地址和MAC地址的对应关系.2. 当源主机需要将一个数据包要发送到目的主机时 ...

  3. iOS - Plist 数据解析

    前言 NS_AVAILABLE(10_6, 4_0) @interface NSPropertyListSerialization : NSObject 如果对象是 NSArray 或 NSDicti ...

  4. 简单的php性能注意点

    什么情况,可能遇到性能问题: 1.php语法使用的不恰当 2.使用php语言做了它不擅长做的事 3.用php语言连接的服务不给力 4.php自身的短板 5.我也不知道的问题 一般情况:php性能问题不 ...

  5. Oracle一列的多行数据拼成一行显示字符

    Oracle一列的多行数据拼成一行显示字符   oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数.    www.2cto.com   先介绍:WMSYS.WM_CO ...

  6. Python 命令行参数和getopt模块详解

    有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的).在C语言里,m ...

  7. Android 设置进度条背景

    Android 设置进度条背景 直接上代码 <ProgressBar android:id="@+id/progressBar" android:layout_width=& ...

  8. bloom filter 详解[转]

    Bloom Filter概念和原理 焦萌 2007年1月27日 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.Bloom ...

  9. html frames

    http://blog.sina.com.cn/s/blog_67697189010116o0.html *********************************************** ...

  10. 软技能:十步学习法 (zhuan)

    http://www.gyzhao.me/2016/11/07/Ten-Step-Learning-Method/ ****************************************** ...