BZOJ3938 & UOJ88:[集训队互测2015]Robot——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3938
小q有n只机器人,一开始他把机器人放在了一条数轴上,第i只机器人在ai的位置上静止,而自己站在原点。在这之后小q会执行一些操作,他想要命令一个机器人向左或者向右移动x格。但是机器人似乎听不清小q的命令,事实上它们会以每秒x格的速度匀速移动。看着自己的机器人越走越远,小q很着急,他想知道当前离他(原点)最远的机器人有多远。具体的操作以及询问见输入格式。注意,不同的机器人之间互不影响,即不用考虑两个机器人撞在了一起的情况。
显然机器人的运动是一个分段一次函数,故可以李超线段树维护之。
然而t很大,所以需要离散化,但是为了答案的正确性,我们需要存真的斜率和截距。
于是参考了其他人的代码,加上自己的码风,将原来的板子又推翻重建,变成了现在这个模样,应该很好看。
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define fi first
#define se second
const int N=1e5+;
const int M=5e5+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
vector<pii>a[N];
int t[N+M],q[M],lim,n,m;
char s[];
struct node{
int l,r;
ll k,b;
node(int L=,int R=,ll K=,ll B=){
l=L,r=R,k=K,b=B;
}
ll point(int x){return k*x+b;}
}mx[(N+M)*],mn[(N+M)*];
inline int LSH(int x){
return lower_bound(t+,t+lim+,x)-t;
}
ll query(int a,int l,int r,int k){
ll a1=abs(mx[a].point(t[k])),a2=abs(mn[a].point(t[k]));
if(l==r)return max(a1,a2);
int mid=(l+r)>>;ll ans;
if(k<=mid)ans=query(a<<,l,mid,k);
else ans=query(a<<|,mid+,r,k);
return max(ans,max(a1,a2));
}
void upt(int a,int l,int r,node k){
int mid=(l+r)>>;
if(k.point(t[mid])>mx[a].point(t[mid]))swap(k,mx[a]);
if(l==r)return;
if(min(mx[a].point(t[l]),mx[a].point(t[r]))>=max(k.point(t[l]),k.point(t[r])))return;
if(mx[a].k>k.k)upt(a<<,l,mid,k);
else upt(a<<|,mid+,r,k);
}
void dwn(int a,int l,int r,node k){
int mid=(l+r)>>;
if(k.point(t[mid])<mn[a].point(t[mid]))swap(k,mn[a]);
if(l==r)return;
if(max(mn[a].point(t[l]),mn[a].point(t[r]))<=min(k.point(t[l]),k.point(t[r])))return;
if(mn[a].k<=k.k)dwn(a<<,l,mid,k);
else dwn(a<<|,mid+,r,k);
}
void insert(int a,int l,int r,node k){
if(r<k.l||k.r<l)return;
if(k.l<=l&&r<=k.r){
upt(a,l,r,k);dwn(a,l,r,k);
return;
}
if(l==r)return;
int mid=(l+r)>>;
insert(a<<,l,mid,k);insert(a<<|,mid+,r,k);
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++)a[i].push_back(pii(,read()));
t[++lim]=;
for(int i=;i<=m;i++){
int x=read();t[++lim]=x;scanf("%s",s);
if(s[]=='c'){
int id=read(),v=read();
a[id].push_back(pii(x,v));
}else q[++q[]]=x;
}
for(int i=;i<=n;i++)a[i].push_back(pii(1e9,));
t[++lim]=1e9;
sort(t+,t+lim+);
lim=unique(t+,t+lim+)-t;
for(int i=;i<=n;i++){
int sz=a[i].size();
ll now=a[i][].se;
node p=node(LSH(a[i][].fi),LSH(a[i][].fi),,now);
insert(,,lim,p);
for(int j=;j<sz-;j++){
int l=a[i][j].fi,r=a[i][j+].fi,k=a[i][j].se;
p=node(LSH(l),LSH(r),k,now-(ll)k*l);
insert(,,lim,p);
now=now+(ll)k*(r-l);
}
}
for(int i=;i<=q[];i++)
printf("%lld\n",query(,,lim,LSH(q[i])));
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ3938 & UOJ88:[集训队互测2015]Robot——题解的更多相关文章
- 【集训队互测2015】Robot
题目描述 http://uoj.ac/problem/88 题解 维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了. 注意卡常,不要写STL,用链表把同类修 ...
- 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)
题目传送门:http://uoj.ac/problem/94 这是一道集合幂级数的入门题目.我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现 ...
- 【loj2461】【2018集训队互测Day 1】完美的队列
#2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...
- 【2018集训队互测】【XSY3372】取石子
题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...
- 洛谷 P4463 - [集训队互测 2012] calc(多项式)
题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...
- UOJ#191. 【集训队互测2016】Unknown 点分治 分治 整体二分 凸包 计算几何
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ191.html 题目传送门 - UOJ191 题意 自行移步集训队论文2016中罗哲正的论文. 题解 自行 ...
- LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)
题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ...
- EZ 2018 05 06 NOIP2018 慈溪中学集训队互测(五)
享受爆零的快感 老叶本来是让初三的打的,然后我SB的去凑热闹了 TM的T2写炸了(去你妹的优化),T1连-1的分都忘记判了,T3理所当然的不会 光荣革命啊! T1 思维图论题,CHJ dalao给出了 ...
- 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)
题目 描述 \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...
随机推荐
- Ruby & Rails学习资料
------------------教程------------- Ruby风格指南(代码规范) https://github.com/bbatsov/ruby-style-guide 笨方法學 Ru ...
- iOS 开发库相关(持续更新)
01-给任意view添加毛玻璃效果 https://github.com/JagCesar/iOS-blur 02-浮动式的textfield输入框(可用于登录界面) https://github ...
- Selenium(Python)生成Html测试报告
由于Python3已经不支持HTMLTestRunner了, 无论是PyCharm还是pip都无法安装成功, 所以只能去 http://tungwaiyip.info/software/HTMLTes ...
- 前后端分离.net core + vuejs + element
查找一些资料,比较了elementui以及Iview,最终还是选择了elementui搭建前后端分离框架,废话少说了,开始搭建环境: 1.基础软件环境 vue开发环境安装: ①nodejs (我安装的 ...
- 使用InstallShield-Limited-Edition制作安装包
1.打开此网站,进行注册,获取序列码以及下载InstallShield-Limited-Edition 2.安装完成之后,打开VisualStudio,新建项目 3.填写基本应用信息 4.配置相关信息 ...
- Python常用函数--return 语句
在Python教程中return 语句是函数中常用的一个语句.return 语句用于从函数中返回,也就是中断函数.我们也可以选择在中断函数时从函数中返回一个值.案例(保存为 function_retu ...
- 关于java中“使用了未经检查或不安全的操作、有关详细信息,请使用 ——Xlint:unchecked重新编译”
今天看<算法 第4版>排序章节时,发现了一个了一个小问题.先贴一下代码: public class Selection{ public static void main(String[]a ...
- 初涉 Deep Drive Dataset
Berkeley 大学最近推出的针对自动驾驶的街景数据集,号称比 Cityscapes 数据量更大,可泛化性更好. 语义实例分割(Semantic Instance Segmentation) 数据集 ...
- Matlab提速方法
1. 向量化. 尽量少用for循环. 2. 循环竖着走比横着走快. 3. 内置函数也有优化的空间 不少内置函数都有大量的error check.直接用profiler找出真正干活的.不少内置函数在网上 ...
- C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...