Description

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

Input

共有m个事件,输入将会按事件的时间顺序给出。第一行两个正整数n,m。接下来一行n个整数,第i个数是ai,表示
第i个机器人初始的位置(初始移动速度为0)。接下来m行,每行行首是一个非负整数ti,表示该事件点发生的时
刻(以秒为单位)。第二个是一个字符串S,代表操作的种类。数字与字符串之间用一个空格隔开。接下来的输入
按S的种类分类。若S是“command”(不带引号),则接下来两个整数ki,xi,表示小q对第ki个机器人执行了操作
,该机器人的速度将会被重置,变为向数轴正方向每秒移动xi格(若xi为负数就相当于向数轴负方向每秒移动∣xi
∣格)。保证1≤ki≤n。若S是“query”(不带引号),则你需要输出当前离原点最远的机器人有多远。保证t1≤
t2≤t2≤...≤tm。(注:若同一时间发生多次操作,则按读入顺序依次执行)
 

Output

对于每个query询问,输出一行,包含一个整数表示正确的答案。C/C++输入输出longlong时请用%lld。由于本题数
据量较大,建议不要使用cin/cout进行输入输出。
 

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≤ti≤10^9,对于所有的 command 满足 ∣xi∣≤10^4。
对于所有的机器人满足 ∣ai∣≤10^9。
N,C<=10^5
Q<=5*10^5
把时间看做x坐标,距离看做y坐标,那么就是一个一次函数
改变速度的处理可以离线,预处理出每一个一次函数所覆盖的区间
坐标太大需要离散
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
typedef long long lol;
struct ZYYS
{
lol l,r,k,id,b;
};
struct rubbish
{
lol t,k,id;
bool kind;
}q[];
struct caiji
{
int p,x;
}b[];
struct Line
{
lol k,b;
bool id;
}tree1[],tree2[];
lol h[],nowb[],nowk[],a[];
lol ansmax,ansmin,T;
int n,m,num,size;
char ch[];
lol gi()
{
lol x=,flag=;
char c=getchar();
while (c<''||c>'')
{
if (c=='-') flag=-;
c=getchar();
}
while (c>=''&&c<='')
{
x=x*+c-'';
c=getchar();
}
return x*flag;
}
bool pd(Line a,Line b,lol x)
{
return a.k*x+a.b>b.k*x+b.b;
}
double cross(Line a,Line b)
{
return (a.b-b.b)/(1.0*(b.k-a.k));
}
lol cal(Line a,lol x)
{
return a.k*x+a.b;
}
void add_max(int rt,int l,int r,Line x)
{
if (l>r) return;
if (!tree1[rt].id)
{
tree1[rt]=x;
return;
}
lol f1=cal(x,h[l]);lol f2=cal(tree1[rt],h[l]);
lol f3=cal(x,h[r]);lol f4=cal(tree1[rt],h[r]);
if (f1<=f2&&f3<=f4) return;
if (f1>=f2&&f3>=f4)
{tree1[rt]=x;return;}
int mid=(l+r)/;
double p=cross(tree1[rt],x);
if (f1>=f2)
{
if (p<=h[mid]) add_max(rt<<,l,mid,x);
else add_max(rt<<|,mid+,r,tree1[rt]),tree1[rt]=x;
}
else
{
if (p>h[mid]) add_max(rt<<|,mid+,r,x);
else add_max(rt<<,l,mid,tree1[rt]),tree1[rt]=x;
}
}
void add_min(int rt,int l,int r,Line x)
{
if (l>r) return;
if (!tree2[rt].id)
{
tree2[rt]=x;
return;
}
lol f1=cal(x,h[l]);lol f2=cal(tree2[rt],h[l]);
lol f3=cal(x,h[r]);lol f4=cal(tree2[rt],h[r]);
if (f1>=f2&&f3>=f4) return;
if (f1<=f2&&f3<=f4)
{tree2[rt]=x;return;}
int mid=(l+r)/;
double p=cross(tree2[rt],x);
if (f1<=f2)
{
if (p<=h[mid]) add_min(rt<<,l,mid,x);
else add_min(rt<<|,mid+,r,tree2[rt]),tree2[rt]=x;
}
else
{
if (p>h[mid]) add_min(rt<<|,mid+,r,x);
else add_min(rt<<,l,mid,tree2[rt]),tree2[rt]=x;
}
}
void update_max(int rt,int l,int r,int L,int R,Line x)
{
if (L>R) return;
if (l>r) return;
if (l>=L&&r<=R)
{
add_max(rt,l,r,x);
return;
}
int mid=(l+r)/;
if (L<=mid) update_max(rt<<,l,mid,L,R,x);
if (R>mid) update_max(rt<<|,mid+,r,L,R,x);
}
void update_min(int rt,int l,int r,int L,int R,Line x)
{
if (L>R) return;
if (l>r) return;
if (l>=L&&r<=R)
{
add_min(rt,l,r,x);
return;
}
int mid=(l+r)/;
if (L<=mid) update_min(rt<<,l,mid,L,R,x);
if (R>mid) update_min(rt<<|,mid+,r,L,R,x);
}
void query_max(int rt,int l,int r,int x)
{
if (l>r) return;
if (tree1[rt].id) ansmax=max(ansmax,cal(tree1[rt],h[x]));
//cout<<ansmax<<endl;
if (l==r)
{
return ;
}
int mid=(l+r)/;
if (x<=mid) query_max(rt<<,l,mid,x);
else query_max(rt<<|,mid+,r,x);
return ;
}
void query_min(int rt,int l,int r,int x)
{
if (l>r) return ;
if (tree2[rt].id)
ansmin=min(ansmin,cal(tree2[rt],h[x]));
//cout<<ansmin<<endl;
if (l==r)
{
return ;
}
int mid=(l+r)/;
if (x<=mid) query_min(rt<<,l,mid,x);
else query_min(rt<<|,mid+,r,x);
return ;
}
int main()
{lol i,x,j,p;
lol k,pos;
//freopen("robot.in","r",stdin);
//freopen("robot.out","w",stdout);
n=gi();m=gi();
for (i=;i<=n;i++)
{
nowb[i]=gi();a[i]=;nowk[i]=;
}
h[]=;
for (i=;i<=m;i++)
{
q[i].t=gi();
h[i+]=q[i].t;
scanf("%s",ch);
if (ch[]=='c')
{
q[i].id=gi();q[i].k=gi();
q[i].kind=;
}
}
size=unique(h+,h+m+)-h-;
for (i=;i<=m;i++)
if (q[i].kind)
{
int x=q[i].id;
int lst=lower_bound(h+,h+size+,a[x])-h;
int now=lower_bound(h+,h+size+,q[i].t)-h;
update_max(,,size,lst,now,(Line){nowk[x],nowb[x],});
update_min(,,size,lst,now,(Line){nowk[x],nowb[x],});
//cout<<lst<<' '<<now<<' '<<nowk[x]<<' '<<nowb[x]<<endl;
nowb[x]=nowb[x]+q[i].t*(nowk[x]-q[i].k);
nowk[x]=q[i].k;a[x]=q[i].t;
}
for (i=;i<=n;i++)
{
int lst=lower_bound(h+,h+size+,a[i])-h;
update_max(,,size,lst,size,(Line){nowk[i],nowb[i],});
update_min(,,size,lst,size,(Line){nowk[i],nowb[i],});
//cout<<lst<<' '<<size<<' '<<nowk[i]<<' '<<nowb[i]<<endl;
}
for (i=;i<=m;i++)
if (q[i].kind==)
{
ansmax=;
ansmin=;
int t=lower_bound(h+,h+size+,q[i].t)-h;
query_max(,,size,t);
query_min(,,size,t);
printf("%lld\n",max(ansmax,-ansmin));
}
}

BZOJ 3938 Robot的更多相关文章

  1. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  2. bzoj3938 Robot

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

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. BZOJ 1408: [Noi2002]Robot

    1408: [Noi2002]Robot Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 510  Solved: 344[Submit][Status][ ...

  5. 【BZOJ】【3205】【APIO2013】机器人robot

    斯坦纳树 好神啊……Orz zyf && PoPoQQQ 为啥跟斯坦纳树扯上关系了?我想是因为每个点(robot)都沿着树边汇到根的时候就全部合起来了吧= =这个好像和裸的斯坦纳树不太 ...

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

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

  7. bzoj 1408 [Noi2002]Robot(欧拉函数)

    [题目链接]  http://www.lydsy.com/JudgeOnline/problem.php?id=1408 [题意] 求m的所有约数中,满足可以分解成(奇数个不同素数/偶数个不同素数/其 ...

  8. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  9. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

随机推荐

  1. 使用jmeter+ant进行接口自动化测试(数据驱动)之二:利用apache-ant执行测试用例并生成HTML格式测试报告

    在 使用jmeter+ant进行接口自动化测试(数据驱动)之一 介绍了如何使用csv文件来批量管理接口 本次接着介绍如何利用apache-ant执行测试用例并生成HTML格式测试报告 ①下载安装 ap ...

  2. [福州大学]W班平时成绩排名

    评分链接 个人作业 第一次作业 http://www.cnblogs.com/1qazse4/p/7506448.html 第二次作业 http://www.cnblogs.com/1qazse4/p ...

  3. C语言程序设计第三次作业--选择结构(1)

    Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...

  4. 实验MyOD

    实验MyOD 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 提交测试代码和运行结果截图,加上学号水印,提交码云代码链接. 代码如下: (刚开始 ...

  5. 20162330 实验一 《Java开发环境的熟悉》 实验报告

    2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验一 <Java开发环境的熟悉> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623 ...

  6. 20162318 实验四 Android程序设计

    北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623班 姓名:张泰毓 指导老师:娄老师.王老师 实验日期:2017年5月26日 实验密级:非密级 实验器材:带Lin ...

  7. 团队作业7——第二次项目冲刺(Beta版本12.06)

    项目每个成员的进展.存在问题.接下来两天的安排. 已完成的内容:队员每个人提出对接下来需要做的事情的看法和意见,将需要做的任务更新到了leangoo中进行管理,产品完成了界面优化的设计,测试复现了之前 ...

  8. oc中protocol、category和继承的区别

    OC中protocol.category和继承的区别以前还是有点迷糊,面试的时候说的有点混乱,现在结合一些资料总结一下. 利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"( ...

  9. C# 封装miniblink 使用HTML/CSS/JS来构建.Net 应用程序界面和简易浏览器

    MiniBlink的作者是 龙泉寺扫地僧 miniblink是什么?   (抄了一下 龙泉寺扫地僧 写的简洁) Miniblink是一个全新的.追求极致小巧的浏览器内核项目,其基于chromium最新 ...

  10. python 人工智能资源推荐

    原创 2017-06-05 玄魂工作室 玄魂工作室 我翻了翻我自己曾经看过的书,还是放弃了推荐.原因很简单,我对这个领域并不是很熟悉,我来推荐资源有点误人子弟.so,简单推点其他人建议给我的内容,希望 ...