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\)值 ...
随机推荐
- DSP5509项目之用FFT识别钢琴音调(1)
1. 其实这个项目难点在于,能不能采集到高质量的钢琴音调.先看一下FFT相关程序. FFT 并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法.由于我们在计算 DFT 时一次复数乘法需用四 ...
- GitLab 自动触发 Jenkins 构建
GitLab 是当前应用非常广泛的 Git Hosting 工具,Jenkins 是非常牛逼的持续集成工具.尽管 GitLab 有内建的 GitLab CI,但它远没有 Jenkins 那么强大好用. ...
- Ruby 基础教程1-3
1.命令行参数ARGV[] 2.文件读取 file=File.open(filename) text=file.read print text file.close 一次读取所有内容耗内存,耗 ...
- meta-data获取小结
android 开发中: 在AndroidManifest.xml中,<meta-data>元素可以作为子元素, 被包含在<activity>.<applicat ...
- Qt 3D Studio 1.0 Resleased
Qt 这家伙又整出一个新东西了,Qt 3D Studio 1.0 新闻链接:https://blog.qt.io/blog/2017/11/30/qt-3d-studio-1-0-released/ ...
- 使用 Fiddler工具模拟post四种请求数据
post请求主体详解: 对于get请求来说没有请求主体entity-body.对于post请求而言,不会对发送请求的数据格式进行限制,理论上你可以发任意数据,但是服务器能不能处理就是另一回事了.服务器 ...
- 移动性能测试之gemebench安装
越来越多的人从事各种移动端性能测试,但工具和文档的资料却相对较少,这两天需要测试一款APP的性能,就来先简单介绍下gamebench的安装吧! 作为国人来说,使用gamebench还是有相当多的坑点: ...
- unity中虚拟摇杆的实现
实现效果: 实现: 使用NGUI添加虚拟摇杆背景和其子物体按钮,为按钮Attach boxcollider和ButtionScript.为按钮添加如下脚本: 注意:其中的静态属性可以在控制物体移动的 ...
- [USACO09Open] Tower of Hay 干草塔
为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上运来,共会出现N包干草,第i包干草的宽度是W i ,高度和长度统一为1.干草塔要从底层开始铺建.贝西会选择最先 ...
- Python-3.6 安装pycrypto 2.6
最近接触公司后台管理系统的开发,其中涉及到加密模块pycrypto. 重点来了!!!!敲黑板!!!! pycrypto在PyCharm中跟其他的模块不一样,pip install pycrypto安装 ...