Description

小 \(q\) 有 \(n\) 只机器人,一开始他把机器人放在了一条数轴上,第 \(i\) 只机器人在 \(a_i\) 的位置上静止,而自己站在原点。在这之后小 \(q\) 会执行一些操作,他想要命令一个机器人向左或者向右移动 \(x\) 格。但是机器人似乎听不清小 \(q\) 的命令,事实上它们会以每秒 \(x\) 格的速度匀速移动。看着自己的机器人越走越远,小 \(q\) 很着急,他想知道当前离他(原点)最远的机器人有多远。具体的操作以及询问见输入格式。注意,不同的机器人之间互不影响,即不用考虑两个机器人撞在了一起的情况。

Input

共有 \(m\) 个事件,输入将会按事件的时间顺序给出。

第一行两个正整数 \(n\),\(m\) 。接下来一行 \(n\) 个整数,第 \(i\) 个数是 \(a_i\),表示第 \(i\) 个机器人初始的位置(初始移动速度为0)。

接下来 \(m\) 行,每行行首是一个非负整数 \(t_i\) ,表示该事件点发生的时刻(以秒为单位)。

第二个是一个字符串 \(S\),代表操作的种类。数字与字符串之间用一个空格隔开。接下来的输入按 \(S\) 的种类分类。若 \(S\) 是 \(“command”\)(不带引号),则接下来两个整数 \(k_i\) ,$ x_i$ ,表示小 \(q\) 对第 \(k_i\) 个机器人执行了操作,该机器人的速度将会被重置,变为向数轴正方向每秒移动 \(x_i\) 格(若 \(x_i\) 为负数就相当于向数轴负方向每秒移动 \(∣x_i∣\)格)。保证 \(1\leq k_i \leq n\)。若 \(S\) 是 \(“query”\)(不带引号),则你需要输出当前离原点最远的机器人有多远。

保证 $t1 \leq t2 \leq ... \leq tm $。(注:若同一时间发生多次操作,则按读入顺序依次执行)

Output

对于每个 \(query\) 询问,输出一行,包含一个整数表示正确的答案。

Sample Input

4 5

-20 0 20 100

10 command 1 10

20 command 3 -10

30 query

40 command 1 -30

50 query

Sample Output

180

280

HINT

第一个命令执行时,各个机器人的位置为:−20,0,20,100。

第二个命令执行时,各个机器人的位置为:80,0,20,100。

第一个询问时,各个机器人的位置为:180,0,−80,100。

第三个命令执行时,各个机器人的位置为:280,0,−180,100。

第二个询问时,各个机器人的位置为:−20,0,−280,100。

限制与约定

设 \(command\) 的个数为 \(C\),\(query\) 的个数为 \(Q\)。(所以 \(C+Q=m\))

对于所有的事件满足 \(0 \leq ti \leq 10^9\),对于所有的 \(command\) 满足 \(∣x_i∣ \leq 10^4\)。

对于所有的机器人满足 \(∣a_i∣ \leq 10^9\) 。

\(N,C \leq 10^5\)

\(Q \leq 5 \times 10^5\)


想法

稍稍转化一下,以时间为 \(x\) 轴,位置为 \(y\) 轴,就是一道经典的李超线段树题。

就是处理细节比较多,要离线处理插入的线段,要对时间离散化。


代码

明明是道水题,我却调了2个多小时,因为一些奇奇怪怪的原因(如 \(double\) 和 \(longlong\) 啊,对时间离散化还是动态开点啊,线段的端点问题啊。。。)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. using namespace std;
  6. int read(){
  7. int x=0,f=1;
  8. char ch=getchar();
  9. while(!isdigit(ch) && ch!='-') ch=getchar();
  10. if(ch=='-') f=-1,ch=getchar();
  11. while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
  12. return x*f;
  13. }
  14. const int N = 600005;
  15. typedef double db;
  16. typedef long long ll;
  17. struct seg{
  18. int x0,x1;
  19. ll k,b;
  20. seg() { x0=x1=0; k=b=0.0; }
  21. seg(int _x0,int _x1,ll _k,ll _b) { x0=_x0; x1=_x1; k=_k; b=_b; }
  22. }d[N];
  23. int tot;
  24. int ask[N],num;
  25. int n;
  26. ll K[N],B[N];
  27. int st[N];
  28. int rk[N*2],rn;
  29. struct node{
  30. node *ch[2];
  31. int mx,mn;
  32. node() { mx=mn=0; ch[0]=ch[1]=NULL; }
  33. }pool[N*4],*root;
  34. int cnt;
  35. void build(node *p,int l,int r){
  36. if(l==r) return;
  37. int mid=(l+r)>>1;
  38. build(p->ch[0]=&pool[++cnt],l,mid);
  39. build(p->ch[1]=&pool[++cnt],mid+1,r);
  40. }
  41. inline ll cal(int x,int c) { return d[x].k*rk[c]+d[x].b; }
  42. bool better_mn(int x,int y,int c) {
  43. if(!x) return false;
  44. if(!y) return true;
  45. return cal(x,c)<cal(y,c);
  46. }
  47. bool better_mx(int x,int y,int c) {
  48. if(!x) return false;
  49. if(!y) return true;
  50. return cal(x,c)>cal(y,c);
  51. }
  52. void insert_mx(node *p,int l,int r,int L,int R,int c){
  53. if(l==L && r==R){
  54. int mid=(l+r)>>1;
  55. if(better_mx(c,p->mx,mid)) swap(p->mx,c);
  56. int tl=better_mx(p->mx,c,l),tr=better_mx(p->mx,c,r);
  57. if(c==0 || l==r || (tl && tr)) return;
  58. if(tl) insert_mx(p->ch[1],mid+1,r,mid+1,r,c);
  59. else insert_mx(p->ch[0],l,mid,l,mid,c);
  60. return;
  61. }
  62. int mid=(l+r)>>1;
  63. if(R<=mid) insert_mx(p->ch[0],l,mid,L,R,c);
  64. else if(L>mid) insert_mx(p->ch[1],mid+1,r,L,R,c);
  65. else{
  66. insert_mx(p->ch[0],l,mid,L,mid,c);
  67. insert_mx(p->ch[1],mid+1,r,mid+1,R,c);
  68. }
  69. }
  70. void insert_mn(node *p,int l,int r,int L,int R,int c){
  71. if(l==L && r==R){
  72. int mid=(l+r)>>1;
  73. if(better_mn(c,p->mn,mid)) swap(p->mn,c);
  74. int tl=better_mn(p->mn,c,l),tr=better_mn(p->mn,c,r);
  75. if(c==0 || l==r || (tl && tr)) return;
  76. if(tl) insert_mn(p->ch[1],mid+1,r,mid+1,r,c);
  77. else insert_mn(p->ch[0],l,mid,l,mid,c);
  78. return;
  79. }
  80. int mid=(l+r)>>1;
  81. if(R<=mid) insert_mn(p->ch[0],l,mid,L,R,c);
  82. else if(L>mid) insert_mn(p->ch[1],mid+1,r,L,R,c);
  83. else{
  84. insert_mn(p->ch[0],l,mid,L,mid,c);
  85. insert_mn(p->ch[1],mid+1,r,mid+1,R,c);
  86. }
  87. }
  88. int Mx,Mn;
  89. void query(node *p,int l,int r,int c){
  90. Mx = better_mx(p->mx,Mx,c) ? p->mx : Mx ;
  91. Mn = better_mn(p->mn,Mn,c) ? p->mn : Mn ;
  92. if(l==r) return;
  93. int mid=(l+r)>>1;
  94. if(c<=mid) query(p->ch[0],l,mid,c);
  95. else query(p->ch[1],mid+1,r,c);
  96. }
  97. int main()
  98. {
  99. int m,t,id,x;
  100. char s[10];
  101. n=read(); m=read();
  102. for(int i=1;i<=n;i++)
  103. K[i]=0,B[i]=read(),st[i]=1;
  104. while(m--){
  105. t=read()+1;
  106. rk[++rn]=t;
  107. scanf("%s",s);
  108. if(s[0]=='c'){
  109. id=read(); x=read();
  110. d[++tot]=seg(st[id],t,K[id],B[id]);
  111. st[id]=t;
  112. B[id]=K[id]*t+B[id]-1ll*x*t;
  113. K[id]=x;
  114. }
  115. else ask[num++]=t;
  116. }
  117. for(int i=1;i<=n;i++) d[++tot]=seg(st[i],t,K[i],B[i]);
  118. rk[++rn]=1;
  119. sort(rk+1,rk+1+rn);
  120. rn=unique(rk+1,rk+1+rn)-rk-1;
  121. build(root=&pool[++cnt],1,rn);
  122. for(int i=1;i<=tot;i++){
  123. if(d[i].x0==d[i].x1 && t!=1) continue;
  124. d[i].x0=lower_bound(rk+1,rk+1+rn,d[i].x0)-rk;
  125. d[i].x1=lower_bound(rk+1,rk+1+rn,d[i].x1)-rk;
  126. insert_mx(root,1,rn,d[i].x0,d[i].x1,i);
  127. insert_mn(root,1,rn,d[i].x0,d[i].x1,i);
  128. }
  129. for(int i=0;i<num;i++){
  130. Mx=Mn=0;
  131. ask[i]=lower_bound(rk+1,rk+1+rn,ask[i])-rk;
  132. query(root,1,rn,ask[i]);
  133. printf("%lld\n",max(abs(cal(Mx,ask[i])),abs(cal(Mn,ask[i]))));
  134. }
  135. return 0;
  136. }

[bzoj3938] [Uoj #88] Robot的更多相关文章

  1. BZOJ3938 & UOJ88:[集训队互测2015]Robot——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3938 http://uoj.ac/problem/88 小q有n只机器人,一开始他把机器人放在了一 ...

  2. 【bzoj3938】 Robot

    http://www.lydsy.com/JudgeOnline/problem.php?id=3938 (题目链接) 题意 给出数轴上$n$个点,有$m$个操作,在时间$t$让一个点以一定的速度移动 ...

  3. bzoj3938 Robot

    3938: Robot Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 336  Solved: 112[Submit][Status][Discuss ...

  4. bzoj千题计划220:bzoj3938: Robot

    http://www.lydsy.com/JudgeOnline/problem.php?id=3938 以时间为x轴,以距离为y轴,那么每个机器人的行走路径就是一条折线 把折线分段加入线段树里,然后 ...

  5. BZOJ3938:Robot

    浅谈标记永久化:https://www.cnblogs.com/AKMer/p/10137227.html 题目传送门:https://www.lydsy.com/JudgeOnline/proble ...

  6. metasploit渗透初探MR.robot(一)

    看了MR.robot,有一种研究渗透技术的冲动, 网上也看了些教程,要从kali linux说起, 下载vmware 12,http://www.vmware.com/go/tryworkstatio ...

  7. Jenkins+Gitlab CE+Robot Framework持续集成

    环境 Ubuntu 14.04.3 LTS Desktop 前提 1.在本地能执行测试脚本(pybot yourTestSuit.txt),本文不讲解如何学习使用RF框架 2.已有Gitlab环境,本 ...

  8. 【集训队互测2015】Robot

    题目描述 http://uoj.ac/problem/88 题解 维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了. 注意卡常,不要写STL,用链表把同类修 ...

  9. 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)

    建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...

随机推荐

  1. linux进程简单睡眠

    当一个进程睡眠, 它这样做以期望某些条件在以后会成真. 如我们之前注意到的, 任何睡 眠的进程必须在它再次醒来时检查来确保它在等待的条件真正为真. Linux 内核中睡眠的 最简单方式是一个宏定义, ...

  2. 2019-8-31-C#-如何写-DEBUG-输出

    title author date CreateTime categories C# 如何写 DEBUG 输出 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 ...

  3. Linux 内核 回顾: ISA

    设计上 ISA 总线非常老了, 并且是非常地低能, 但是它仍然持有一块挺大的控制设备的 市场. 如果速度不重要并且你想支持老式主板, 一个 ISA 实现要优于 PCI. 这个老标准 的另外一个好处是如 ...

  4. 2018-11-13-WPF-禁用实时触摸

    title author date CreateTime categories WPF 禁用实时触摸 lindexi 2018-11-13 10:45:37 +0800 2018-5-4 21:0:3 ...

  5. 2018-11-9-win2d-CanvasCommandList-使用方法

    title author date CreateTime categories win2d CanvasCommandList 使用方法 lindexi 2018-11-9 20:8:4 +0800 ...

  6. Android生命周期函数执行顺序

    转载自:http://blog.csdn.net/intheair100/article/details/39061473 程序正常启动:onCreate()->onStart()->on ...

  7. Excel数据处理

    合并计算: 数据面板下的合并计算 然后设置好合并计算的区域 以及勾选 首行跟最左列

  8. mysql主从之配置验证

    实验环境: master  192.168.132.121 主库 slave     192.168.132.122 从库 一 mysql主从复制的配置 1.1 mysql主库给从库复制的权限 mys ...

  9. 【他山之石】jenkins忘记初始化密码解决办法

    没有太好的方式,网上有的是这样子的,找到 /var/lib/jenkins/users/username/config.xml, 修改为一个已知的 hash 值 #jbcrypt:$2a$10$Dda ...

  10. 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)

    [题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...