[HDU5714]拍照

题目大意:

河上有\(n(n\le10^4)\)个船只,小明希望把尽可能多的船只都完整地拍到一张照片中。

小明位于河的边上,并且可以在河边的任意位置进行拍照,照相机的视野恰好为\(90\)度角,只能以垂直于河边的方向进行拍照。河上的船只全都可看作是平行于河边的一条线段,左右坐标分别为\(x_i,y_i\),跟河边的距离为\(z_i\),有的正在向左移动,有的正在向右移动,但移动速度恰好都是一样的。小明可以等待恰当的时间让尽量多的船只都走进照相机的视野里,你不需要考虑船只之间会互相遮挡视野的情况。

思路:

根据运动的相对性,我们不妨以向右移动的船作为参照物,那么剩下的船按照相同的速度像左运动。

显然\(y_i-x_i>2z_i\)的船注定无法完全拍摄。否则初始状态下,每个船在岸上可以被看见的区间是\([y_i-z_i,x_i+z_i]\)。

用对于向左、右行驶的船只,用线段树分别维护能够看到的区间。

枚举人站的位置\(i\),由于向右行驶的船不动,能看到的向右行驶的船的数量是确定的。我们在向左行驶的线段树上查找大于等于\(i\)的位置上能看到的船数的最大值即可。

源代码:

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<algorithm>
  4. inline int getint() {
  5. register char ch;
  6. register bool neg=false;
  7. while(!isdigit(ch=getchar())) neg|=ch=='-';
  8. register int x=ch^'0';
  9. while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
  10. return neg?-x:x;
  11. }
  12. const int N=1e4+1;
  13. struct Boat {
  14. int x,y,z,d;
  15. };
  16. Boat b[N];
  17. int tmp[N<<1];
  18. class SegmentTree {
  19. #define _left <<1
  20. #define _right <<1|1
  21. #define mid ((b+e)>>1)
  22. private:
  23. int val[N<<3],tag[N<<3];
  24. void push_up(const int &p) {
  25. val[p]=std::max(val[p _left],val[p _right]);
  26. }
  27. void push_down(const int &p) {
  28. if(tag[p]==0) return;
  29. tag[p _left]+=tag[p];
  30. tag[p _right]+=tag[p];
  31. val[p _left]+=tag[p];
  32. val[p _right]+=tag[p];
  33. tag[p]=0;
  34. }
  35. public:
  36. void build(const int &p,const int &b,const int &e) {
  37. tag[p]=val[p]=0;
  38. if(b==e) return;
  39. build(p _left,b,mid);
  40. build(p _right,mid+1,e);
  41. }
  42. void modify(const int &p,const int &b,const int &e,const int &l,const int &r) {
  43. if(b==l&&e==r) {
  44. val[p]++;
  45. tag[p]++;
  46. return;
  47. }
  48. push_down(p);
  49. if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r));
  50. if(r>mid) modify(p _right,mid+1,e,std::max(mid+1,l),r);
  51. push_up(p);
  52. }
  53. int query(const int &p,const int &b,const int &e,const int &l,const int &r) {
  54. if(b==l&&e==r) return val[p];
  55. push_down(p);
  56. int ret=0;
  57. if(l<=mid) ret=std::max(ret,query(p _left,b,mid,l,std::min(mid,r)));
  58. if(r>mid) ret=std::max(ret,query(p _right,mid+1,e,std::max(mid+1,l),r));
  59. return ret;
  60. }
  61. #undef _left
  62. #undef _right
  63. #undef mid
  64. };
  65. SegmentTree t[2];
  66. int main() {
  67. const int T=getint();
  68. for(register int i=1;i<=T;i++) {
  69. int n=getint();
  70. tmp[0]=0;
  71. for(register int i=1;i<=n;i++) {
  72. const int x=getint(),y=getint(),z=getint(),d=getint();
  73. if(y-x>z*2) {
  74. i--;
  75. n--;
  76. continue;
  77. }
  78. b[i]=(Boat){x,y,z,d};
  79. tmp[++tmp[0]]=x+z;
  80. tmp[++tmp[0]]=y-x;
  81. }
  82. std::sort(&tmp[1],&tmp[tmp[0]]+1);
  83. tmp[0]=std::unique(&tmp[1],&tmp[tmp[0]]+1)-&tmp[1];
  84. t[0].build(1,1,tmp[0]);
  85. t[1].build(1,1,tmp[0]);
  86. for(register int i=1;i<=n;i++) {
  87. const int &x=b[i].x,&y=b[i].y,&z=b[i].z,&d=b[i].d;
  88. const int l=std::lower_bound(&tmp[1],&tmp[tmp[0]]+1,y-z)-tmp;
  89. const int r=std::lower_bound(&tmp[1],&tmp[tmp[0]]+1,x+z)-tmp;
  90. t[d==1].modify(1,1,tmp[0],l,r);
  91. }
  92. int ans=0;
  93. for(register int i=1;i<=tmp[0];i++) {
  94. ans=std::max(ans,t[1].query(1,1,tmp[0],1,i)+t[0].query(1,1,tmp[0],i,tmp[0]));
  95. }
  96. printf("Case #%d:\n%d\n",i,ans);
  97. }
  98. return 0;
  99. }

[HDU5714]拍照的更多相关文章

  1. hdu-5714 拍照(二分)

    题目链接: 拍照 Time Limit: 6000/3000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Proble ...

  2. hdu5714 拍照[2016百度之星复赛C题]

    由于船移动的速度都一样,那么对于往一个方向的船相对距离其实是不变的,我们可以把往一个方向移动的船都视作静止,并求出在哪些观测位置可以看到,很明显对于船[x,y,z],当x+z>=y-z的时候,可 ...

  3. UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)

    最近在忙Asp.Net MVC开发一直没空更新UWP这块,不过有时间的话还是需要将自己的经验和大家分享下,以求共同进步. 在上章[UWP开发之Template10实践:本地文件与照相机文件操作的MVV ...

  4. mono for android 获取手机照片或拍照并裁剪保存

    axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  5. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...

  6. H5拍照应用开发经历的那些坑儿

    一.项目简介 1.1.项目背景:这是一个在移动终端创新应用的项目,用户在浏览器端(微信/手Q)即可完成与金秀贤的合影,希望通过这样一种趣味体验,引发用户的分享与转发的热潮. 1.2.系统要求:ios6 ...

  7. html5上传图片(二)一解决部分手机拍照上传图片转向问题

    本以为解决跨域上传后没有问题了,不成想被测试找出一个问题,那就是在手机上拍照上传后图片会旋转.很头痛,不过没有办法,问题还是需要解决的.在查阅了一系列资料后我找到了相应的解决方案,利用exif.js获 ...

  8. 用AVFoundation自定义相机拍照

    自定义拍照或者录视频的功能,就需要用到AVFoundation框架,目前我只用到了拍照,所以记录下自定义拍照用法,视频用法等用上了再补充,应该是大同小异 demo在这里:https://github. ...

  9. 微信调用照相拍照等 js 接口的权限配置 和 照片上传和下载实现

    直接上代码: 1. 前端调试代码: <html> <head> <meta http-equiv="Content-Type" content=&qu ...

随机推荐

  1. bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅

    http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美 ...

  2. Python字符串颜色输出

    \033[1;31;40m      # 1是显示方式(可选),31是字体颜色,40m 是字体背景颜色: \033[0m           # 恢复终端默认颜色,即取消颜色设置: # cat col ...

  3. OpenResty 扩展库(二)lua-resty-template

    Lua和OpenResty的模板引擎(HTML) 模板语法 您可以在模板中使用以下标签: {{expression}},写入表达式的结果 - html转义 {*expression*},写入表达结果 ...

  4. Spring RedisTemplate操作-xml配置(1)

    网上没能找到全的spring redistemplate操作例子,故特意化了点时间做了接口调用练习,基本包含了所有redistemplate方法. 该操作例子是个系列,该片为spring xml配置, ...

  5. django2.0 官方中文文档地址

    django2.0 官方开始发布中文文档了,之前还想着一直翻译完成所有有必要的内容,想着可以省事一些了,打开以后看了一下,发现官方的中文文档还没翻译完成, 现在(2018-7-10)最新章节是是  编 ...

  6. 【GDOI2018】所有题目和解题报告

    使用说明:题意和数据范围都只是回忆内容,仅供参考.题解陆续补上. Day 1 第一题 题意:给定n个数字,要求划分成k的连续段使得每个连续段内的数字之和相同,求最大的k.n,Σai<=10^6. ...

  7. 20155222 2016-2017-2 《Java程序设计》第6周学习总结

    20155222 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 从应用程序的角度来看,如果要将数据从来源中取出,可以使用输入串流:如果要将数据写入目的地,可 ...

  8. MySQL5.7 GTID在线开启与关闭【转】

    当前场景   当前某些业务还有未开启GTID服务组,升级5.7后,如何检测是否符合开启GTID条件,如何在线修改切换使用GTID:已经升级5.7后,已经开启GTID,如何快速回滚后退: 线上gtid如 ...

  9. 【译】ASP.NET Identity Core 从零开始

    原文出自Rui Figueiredo的博客,原文链接<ASP.NET Identity Core From Scratch> 译者注:这篇博文发布时正值Asp.Net Core 1.1 时 ...

  10. 001_fpm打包命令详解

    使用fpm来制作rpm包 2017/2/22 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...