https://www.lydsy.com/JudgeOnline/problem.php?id=3938

http://uoj.ac/problem/88

小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——题解的更多相关文章

  1. 【集训队互测2015】Robot

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

  2. 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)

    题目传送门:http://uoj.ac/problem/94 这是一道集合幂级数的入门题目.我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现 ...

  3. 【loj2461】【2018集训队互测Day 1】完美的队列

    #2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...

  4. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

  5. 洛谷 P4463 - [集训队互测 2012] calc(多项式)

    题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...

  6. UOJ#191. 【集训队互测2016】Unknown 点分治 分治 整体二分 凸包 计算几何

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ191.html 题目传送门 - UOJ191 题意 自行移步集训队论文2016中罗哲正的论文. 题解 自行 ...

  7. LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)

    题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ...

  8. EZ 2018 05 06 NOIP2018 慈溪中学集训队互测(五)

    享受爆零的快感 老叶本来是让初三的打的,然后我SB的去凑热闹了 TM的T2写炸了(去你妹的优化),T1连-1的分都忘记判了,T3理所当然的不会 光荣革命啊! T1 思维图论题,CHJ dalao给出了 ...

  9. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

随机推荐

  1. myeclipse 配置堆内存

    2.非堆内存分配 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64:由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4. 打开myeclipse ...

  2. Jquery获取DOM绑定事件

    获取到当前正在执行的事件: $('#testDive').bind('click', function(event){alert('event: ' + event.type)}); 获取所有绑定事件 ...

  3. 第六模块:WEB框架开发 第1章·Django框架开发50~87

    51-表关系之一对多 52-表关系之多对多 53-表关系之一对一 54-数据库表关系之关联字段与外键约束 55-数据库表关系之sql创建关联表 56-ORM生成关联表模型 57-多表操作之一对多添加记 ...

  4. Unity编辑器 - 使用GL绘制控件

    Unity编辑器 - 使用GL绘制控件 控件较为复杂时,可能造成界面卡顿,在EditorGUI中也可以灵活使用GL绘制来提升性能. 以绘制线段为例: using UnityEngine; using ...

  5. Python的包(Packages)

    包,Package,是一种Python模块的集合,从文件组织形式上看,包就是一个文件夹,里面放着各种模块(.py文件),也可以有子文件夹(子包).包名构建了一个Python模块的命名空间.比如,模块名 ...

  6. leetcode-组合总数III(回溯)

    组合总和 III 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合.  示例 ...

  7. mysql数据库常用操作

    目前最流行的数据库: oracle.mysql.sqlserver.db2.sqline --:单行注释 #:也是单行注释 /* 注释内容*/:多行注释 mysql -uroot -p密码:登录mys ...

  8. 【Linux 运维】linux系统修改主机名

    主机名的修改:  1.命名解释: [root@localhost~]# 分别代表: 用户名(root) 主机名(localhost) 当前路径(~,当前用户的home目录) 权限标志位(#代表root ...

  9. hibernate 异常a different object with the same identifier value was already associated with the session

    在使用hibernate的时候发现了一个问题,记录一下解决方案. 前提开启了事务和事务间并无commit,进行两次save,第二次的时候爆出下面的异常a different object with t ...

  10. ServiceStack.Ormlit 使用Insert的时候自增列不会被赋值

    Insert签名是这样的,将第2个参数设置为true就会返回刚插入的自增列ID了,然后可以手工赋值到对象上面去 public static long Insert<T>(this IDbC ...