[USACO15JAN]踩踏Stampede

题目描述

DJ站在原点上向y轴正半轴看,然后有一群奶牛从他眼前飞过。这些奶牛初始都在第二象限,尾巴在(Xi,Yi),头在(Xi+1,Yi),每Ci秒向右走一个单位。 DJ能看见一匹奶牛当且仅当它身体任意某部位x坐标为0时,没有其它y坐标小于此奶牛的奶牛身体某部位x坐标为0。 问DJ能看见多少奶牛?

输入格式:

第一行:一个数,给出n,表示n头牛。

第二行:三个数,给出Xi和Yi,描述第i头牛的位置,给出Ci,描述这头牛多少秒走一个单位。

输出格式:

一行,给出ans,即DJ能看到多少头牛。

输入输出样例

输入样例#1:

3
-2 1 3
-3 2 3
-5 100 1

输出样例#1:

2

样例说明

DJ能看到第一和第二头牛,看不到第三头牛。

思路

  首先,每一头牛的Xi,Yi,Ci都可能非常的大,所以用普通的暴力搜索是过不去的,所以就要换一个方法去想问题,题目中给出了速度,路程,那么我们可以很容易就想到时间。以样例为例:第一头牛的头到达y轴的时间记为B1=(-2+1)*(-1)*3=3,第一头牛的尾巴到达y轴的时间记为E1=B1+3=6,就像这样我们能知道在第3秒到第6秒时第一头牛是在y轴上的;同理,我们可以知道第二头牛在第6秒到第9秒时是在y轴上的,第三头牛在第4秒到第5秒时是在y轴上的。有人会问知道这些有什么用呢?由于知道时间和纵坐标的位置,我们可以轻易的推出来任意两头牛是否有重叠,方法是当且仅当第i头牛的时间段与第j头牛的时间段有重叠,并且第i头牛的纵坐标比第j头牛的纵坐标小才能当上第j头牛。

  由于我只需要看到这头牛的一部分就算看到,那么我们每一次只需要看一下当前牛的时间段是否被覆盖了,如果没有被全被覆盖则ans++,这头牛可以被看到,并且把这个时间段全部覆盖。那么现在有一个问题了,怎么能保证每一头牛能在恰当的时间进行验证呢?我们需要把牛按纵坐标进行排序,在一一进行验证,这样就可以保证纵坐标小的牛不被纵坐标大的牛遮挡住。既然思路已经出来,那么算法十分容易分析出来,区间查询+区间修改=线段树。我们再看一下每一个数是十分大的,如果直接进行线段树覆盖会MLE,那么是不是可以把时间离散化一下?我们把时间点排序,在更形成序号就可以啦,再看样例这些牛中出现了3,6,9,4,5五个时间点,排序过后是3,4,5,6,9,那么第一头牛就可以化为在第1秒到第4秒在y轴上,第二头牛就可以化为在第4秒到第5秒在y轴上,第一头牛就可以化为在第2秒到第3秒在y轴上。这样每一次操作就十分方便了。

  注意:由于时间点重合可能是像2~3,3~4和4~5这样的时间段,那么如果直接按照时间点进行查询和覆盖就可能出现问题,比如说先覆盖2~3和4~5,那么查找3~4时便会出现问题,所以每一次覆盖和查询的是线段,比如2~6是覆盖和查询2~5的线段。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 #define mid ((l+r)>>1)
 5 struct Cow{
 6     int high,order_l,order_r;
 7 }cow[50001];
 8 struct Num{
 9     int order,order2;
10     int x;
11 }num[100001];
12 bool cmp1(const Num &a,const Num &b){
13     return a.x<b.x;
14 }
15 bool cmp2(const Num &a,const Num &b){
16     return a.order<b.order;
17 }
18 bool cmp3(const Cow &a,const Cow &b){
19     if(a.high==b.high)return a.order_r-a.order_l<b.order_r-b.order_l;
20     return a.high<b.high;
21 }
22 int n;
23 int idx,idx2;
24 int ans;
25 bool tree[1000000];
26 void push(int p){
27     tree[p<<1]=tree[(p<<1)|1]=tree[p];
28 }
29 bool find(int p,int l,int r,int x,int y){
30     if(tree[p])push(p);
31     if(l>=x&&r<=y)
32         return tree[p];
33     bool is1=false,is2=false,is3=false,is4=false;
34     if(x<=mid)is1=find(p<<1,l,mid,x,y),is3=true;
35     if(y>mid)is2=find((p<<1)|1,mid+1,r,x,y),is4=true;
36     if(is1==is3&&is2==is4)return true;
37     return false;
38 }
39 void add(int p,int l,int r,int x,int y){
40     if(l>=x&&r<=y){
41         tree[p]=true;
42         return;
43     }
44     if(x<=mid)add(p<<1,l,mid,x,y);
45     if(y>mid)add((p<<1)|1,mid+1,r,x,y);
46     if(tree[p<<1]&&tree[(p<<1)|1])tree[p]=true;
47 }
48 int main(){
49     scanf("%d",&n);
50     for(int i=1;i<=n;i++){
51         int a,speed;
52         scanf("%d%d%d",&a,&cow[i].high,&speed);
53         ++idx;
54         num[idx].x=(-1-a)*speed;
55         num[idx].order=idx+1;
56         ++idx;
57         num[idx].x=num[idx-1].x+speed;
58         num[idx].order=idx+1;
59     }
60     sort(num+1,num+idx+1,cmp1);
61     for(int i=1;i<=idx;){
62         int tmp=0;
63         ++idx2;
64         while(num[i].x==num[i+tmp].x)
65             num[i+tmp].order2=idx2,++tmp;
66         i+=tmp;
67     }
68     sort(num+1,num+idx+1,cmp2);
69     for(int i=1;i<=idx;i++){
70         (num[i].order%2)?
71         cow[num[i].order/2].order_r=num[i].order2:
72         cow[num[i].order/2].order_l=num[i].order2;
73     }
74     sort(cow+1,cow+n+1,cmp3);
75     for(int i=1;i<=n;i++){
76         if((!find(1,1,idx2,cow[i].order_l,cow[i].order_r-1))){
77             ans++;
78         }
79         add(1,1,idx2,cow[i].order_l,cow[i].order_r-1);
80     }
81     printf("%d",ans);
82 }

View Code

转载于:https://www.cnblogs.com/yangsongyi/p/8664649.html

[USACO15JAN]踩踏Stampede相关推荐

  1. 活久见!一美国大爷发明了永不掉链子的自行车,垂直踩踏即可驱动

    全世界只有3.14 % 的人关注了 爆炸吧知识 ©文丨 直观学机械.自行车网 最近,一款能永不掉链子的自行车特别火,咱们今天来看看它长什么样. 这款自行车据说是由美国洛杉矶的一位老大爷 Rodger ...

  2. 回顾外滩踩踏事件,吸取的教训

    外滩踩踏事故:悲剧为何发生?  截至当前,上海外滩踩踏事故已造成36人遇难.47人受伤.事故发生的原因初步显现,为外滩观景平台的人流对冲.很多人认为这种归因过于简单,更何况上海的公共预案相对成熟.事实 ...

  3. 加油站踩踏式逃亡?电网成大赢家?时代抛弃你的时候,真的一声不吭

    电力网按: 时代抛弃你的时候,真的一声不吭!新能源汽车的渗透率远超想象,在电子游戏.移动互联网.短视频时代成长起来的Z世代,没有接受过燃油车时代的恩惠,对电动车天然接受程度高,这部分人群即将或者已经成 ...

  4. 【解决方案】文化体育场馆如何搭建远程网络视频监控,防范突发人流拥挤踩踏事件?

    一.建设背景 文体馆的安全建设和发展是对人民群众和参观游客的人身安全负责的首要责任.场馆的游客聚集流入以及中小学生等青少年群体的集中参观,同时鉴于频繁发生的场馆人流聚集拥挤和踩踏事件,安全防范系统的建 ...

  5. 从奥运门票系统瘫痪到家乐福踩踏事件看软件设计中业务模型的处理

    从奥运门票系统瘫痪到家乐福踩踏事件看软件设计中业务模型的处理 作者:郭方明 完成日期:2007-11-17 version 1.0 联系信箱:gfm.job@Gmail.com 注:转载文章,请注明作 ...

  6. 上海踩踏事件所想,莫把应急预案当摆设

    2014年12月31日,人们还沉浸在辞旧迎新的气氛中,微信上还在互相发着红包,微博上突然出现了上海外滩踩踏事件的消息.这个事件突发而至,36人死亡.47人受伤的结果,让我们在2015年的第一天&quo ...

  7. 如何在踩踏事故中幸存以及如何避免踩踏事故发生

    一月一日只是普通的一天. 很遗憾的是,在这普通的一天的清晨,我要写下这样一段文字. 踩踏,是一种极其原始的事故.每年东非大迁徙的过程中都有很多食草动物死于同类的蹄子之下.而人群的踩踏事故更是在史书上画 ...

  8. 小班安全优质课教案《防止拥挤踩踏事故》

    小班安全优质课教案<防止拥挤踩踏事故> 一.活动的背景:最近,很多学校都发生了踩踏事件,造成了多名学生死亡和受伤,其中的厉害程度值得我们引起重视.对于刚入园的小班幼儿来说,这方面的意识更加 ...

  9. 一周技术思考(第36期)-缓存踩踏与惊群效应

    图自网络 "10年前的那一天Facebook发生了什么",本想用这个题目,但不符合本系列的气质,那,那天到底发生了什么呢. Facebook的事故介绍 2010年9月23日,Fac ...

最新文章

  1. Remove Duplicates from Sorted Array II -- LeetCode
  2. python入门指南 许半仙 txt-小九 第7章(1/1)_新笔趣阁
  3. Android --- 选项卡背景样式,左侧边有颜色
  4. 信息学奥赛C++语言: 素数回文数的个数
  5. Unity3d暴风魔镜发布ios问题记录
  6. jQuery全局Ajax事件处理器
  7. Leetcode每日一题:7.整数反转
  8. uboot第一阶段详细分析
  9. 【GIMP教程探索系列】GIMP将照片修改为符合要求的证件照吗,修改尺寸与像素,压缩图像大小
  10. MATLAB常用的滤波函数比较:均值滤波 和 中值滤波
  11. 用MATLAB实现一个数字图像加密解密系统
  12. android service设置persistent,Persistent service
  13. php edm 系统,edm.php · 那些年我们一起/fanwe - Gitee.com
  14. 【Linux】大数据开发中常用的shell命令
  15. 设计模式8之中介者模式
  16. 《西瓜书》第六章 公式6.2推导 空间任一点到超平面的距离
  17. 新车查询价格流量主小程序开发
  18. 专利申请的费用和提交材料
  19. 苏宁面试题,笔试题回顾
  20. 第十二届蓝桥杯大赛软件赛决赛(C/C++ 大学C组)

热门文章

  1. Java 按位与 Java代码_(Java)按位与运算符-是否用于减少前一个位间隔?
  2. thinkpad触控笔怎么用_电容笔怎么用,如何选择一支电容笔来提升生产力呢?
  3. 新时达二代操作器刷写数据线_新时达380全系一体机快捷调试
  4. 怎样获取网站的域名_深入挖掘同行,厉害的人是怎样做的?
  5. 求一个简单的java线程代码,Java线程代码的实现方法
  6. 安卓一键新机_安卓福音!微信终于推出这个功能,再也不用羡慕iPhone
  7. 开发日记-20190527 关键词 ubuntu无线网卡驱动安装
  8. python 私有和保护成员变量如何实现?—— 单下划线 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量; 双下划线 开始的是私有成员,意思是只有类对象自己能访问...
  9. 5G信令(就是用户身份信息)风暴——就是客户端通过公钥加密的消息(携带手机IMSI号)发给服务端,服务器需用私钥解密,这个解密比较消耗资源,如果短时间大量请求到来就会触发信令风暴...
  10. 吃CPU的openmp 程序