Description

  

​   题目链接

  

  

  

Description

  

​   好题。题意是维护一个初始值,交替加减一段时间,有上界\(m\)和下界0(不能超过这两条界限),问对于某一种初始值,在某一个时刻时该值为多少?

  

​   可以把所有询问按时间排序成一列,然后用线段树区间加减、区间min、max暴力实现,然而我不会做。

  

​   实际上直接模拟即可。

  

​   如果按时间增长为横坐标,按该时间的权值为纵坐标,画出对于\([0,m]\)的每一种初始值的函数图像,我们会发现,随着时间的增长,函数曲线变得原来越少,也就是图像会不断重叠在一起。

  

​   形式化地讲,我们可以发现一个重要性质:对于一个在某一时刻触碰到上/下边界的曲线,在这个时刻之后,其函数图像将会和在这个时刻之前已触碰到上/下边界的曲线完全相同。

  

   在某一时刻时,我们称一个初始值为“归上”,当且仅当其在这个时刻及以前已经触碰到了上边界;“归下“同理。我们发现,对于任意确定时刻,”归上“的初始值都是\([y,m]\),而"归下"的初始值都是\([0,x]\)。而且随着时间推进,\(y\)单调不增,\(x\)单调不减。

  

​   既然询问已经以时间递增的顺序给出,那我们就顺序模拟时间推进,并逐一处理询问。

  

​   我们要维护的东西有三个:"归上"初始值在当前时间的具体取值\(up\)、“归下”的初始值在当前时间的具体取值\(dn\),以及从开始到现在上下移动的总和\(sum\)。

  

​   对于一个询问\((t,a)\),假设时间已经模拟到了\(t\),如果\(a\)"归上",也就是曾经碰到上边界,那么答案就是\(up\);如果其"归下",则答案就是\(dn\);否则,\(a\)从开始到现在没有碰到任何边界,所以其取值直接模拟即可,恰好为\(a+sum\)。至于”是否曾经触边“的判定,可以维护\(sum\)有史以来的最大值和最小值,加在\(a\)上判定与0或m的大小关系即可。

  

​   对于\(up\)和\(dn\)的计算,在初始时令\(dn=0\),\(up=m\),然后在时间推进的过程中不断对它们进行带边界限制的模拟上下移动,那么我们就可以保证在每一个时刻时,\(up\)和\(dn\)都是我们所定义的值。为什么?因为初始时,“归上”恰好只有\(m\),"归下"恰好只有0。而之后触碰到上/下边界的所有曲线,都必定在m/0之后触碰,也必定在m/0之后成为"归上"/“归下"。只要一触碰,其函数值就会和m/0相同。于是本质上,我们是在维护\(a=0\)和\(a=m\)在任意时刻的取值。

  

​   形象地讲,这道题就像一个非弹性形变的柱子在管道里上下移动,柱子的”长度“就代表着那一部分从未触边的初始值,而上面和下面空出来的部分,代表着上面这些取值的答案都是柱子的”上端“,下面这些初始值的答案都是柱子的“下端”。为什么会空出来呢?因为曾经被“挤”在一起了,因此这一部分初始值在以后的取值都相同了。那么\(up\)和\(dn\)其实就是柱子的上下端。

  

  

  

Code

  

  1. #include <cstdio>
  2. using namespace std;
  3. const int N=100005;
  4. int n,m,q,a[N];
  5. int l,r,sum,summn,summx;
  6. inline int min(int x,int y){
  7. return x<y?x:y;
  8. }
  9. inline int max(int x,int y){
  10. return x>y?x:y;
  11. }
  12. inline void move(int &x,int d,int tim){
  13. x+=d*tim;
  14. if(x>m) x=m;
  15. if(x<0) x=0;
  16. }
  17. void cont(int tim,int d){
  18. static int lasttim=0;
  19. int delta=tim-lasttim;
  20. lasttim=tim;
  21. sum+=delta*d;
  22. summn=min(summn,sum);
  23. summx=max(summx,sum);
  24. move(l,d,delta);
  25. move(r,d,delta);
  26. }
  27. int query(int x){
  28. if(x+summn<=0) return l;
  29. else if(x+summx>=m) return r;
  30. else return x+sum;
  31. }
  32. int main(){
  33. scanf("%d%d",&m,&n);
  34. for(int i=1;i<=n;i++)
  35. scanf("%d",a+i);
  36. scanf("%d",&q);
  37. l=0; r=m;
  38. sum=summx=summn=0;
  39. int i=1,d=-1,x,y;
  40. while(q--){
  41. scanf("%d%d",&x,&y);
  42. for(;i<=n&&a[i]<=x;cont(a[i++],d),d=-d);
  43. cont(x,d);
  44. printf("%d\n",query(y));
  45. }
  46. return 0;
  47. }

【ARC082D】Sandglass的更多相关文章

  1. 【AtCoder】ARC082 F - Sandglass

    [链接]F - Sandglass [题意]给定沙漏A和B,分别装着a和X-a的沙子,开始时A在上B在下,每秒漏1,漏完不再漏.给定n,有n个时刻ai沙漏倒转.给定m个询问,每次询问给定初值a和时刻t ...

  2. 【AtCoder Regular Contest 082 F】Sandglass

    [链接]点击打开链接 [题意] 你有一个沙漏. 沙漏里面总共有X单位的沙子. 沙漏分A,B上下两个部分. 沙漏从上半部分漏沙子到下半部分. 每个时间单位漏1单位的沙子. 一开始A部分在上面.然后在r1 ...

  3. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  4. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  5. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  8. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  9. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

随机推荐

  1. WPF bind baidu Image

     as there baidu image has protect refer from other site to use. need download i use request header a ...

  2. jQuery.bsgrid

    http://thebestofyouth.com/bsgrid/ 支持json.xml数据格式,皮肤丰富并且容易定制,支持表格编辑.本地数据.导出参数构建等实用便捷的功能,容易扩展,更拥有丰富的示例 ...

  3. WPF编程,窗体最大化、最小化、关闭按钮功能的禁用

    原文:WPF编程,窗体最大化.最小化.关闭按钮功能的禁用 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/detail ...

  4. CentOS7永久挂载硬盘

    刚新装一台服务器,有一块120G的SSD和一块1T的HHD,把cenos7装在了SSD上,进系统默认是找不到HHD的,现需要将其挂载上去. 1.先查看服务器的硬件信息 # fdisk -l 可以看到如 ...

  5. libgdx学习记录12——圆角矩形CircleRect

    libgdx提供了ShapeRenderer这个工具,用它可以画点.画线.画圆.画矩形.画椭圆.画扇形,但是没有提供画圆角矩形的方法. 刚开始自己尝试分成8端,4端画直线,4端画扇形,发现多了半径几部 ...

  6. 使用python处理百万条数据分享(适用于java新手)

    1.前言 因为负责基础服务,经常需要处理一些数据,但是大多时候采用awk以及java程序即可,但是这次突然有百万级数据需要处理,通过awk无法进行匹配,然后我又采用java来处理,文件一分为8同时开启 ...

  7. memcached 和redis比较

    同属于NOSQL存储,网上流传很多memcached能做的是redis都可以做,为什么基本现在两种都火,原因他们有各自擅长的地方. memcahed内部采用多核模式,单列运行很快.memcached采 ...

  8. 测试开发:Python+Django实现接口测试工具

    Python+Django接口自动化 引言: 最近被几个公司实习生整自闭了,没有基础,想学自动化又不知道怎么去学,没有方向没有头绪,说白了其实就是学习过程中没有成就感,所以学不下去.出于各种花里胡哨的 ...

  9. Git多人协作工作流程

    前言 之前一直把Git当做个人版本控制的工具使用,现在由于工作需要,需要多人协作维护文档,所以去简单了解了下Git多人协作的工作流程,发现还真的很多讲解的,而且大神也已经讲解得很清楚了,这里就做一个简 ...

  10. 微软职位内部推荐-Principal Software Eng Mgr

    微软近期Open的职位: Job Title: &nbsp Principal Software Eng Mgr Work Location: Shanghai, China Job Desc ...