题目描述

http://uoj.ac/problem/88

题解

维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了。

注意卡常,不要写STL,用链表把同类修改串起来就好了。

代码

%:pragma GCC optimize()
%:pragma GCC optimize()
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<cstdlib>
#define N 600009
using namespace std;
typedef long long ll;
struct node{ll tim,x;};
int n,m,la[N],pre[N];
ll t[N],pos[N],b[N],top,now[N],k[N],x[N],tag[N];
char s[];
inline ll rd(){
ll x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
inline ll calc(ll l,ll r,ll x,ll k){return x+k*(r-l);}
struct segment1{
struct seg{
int l,r;ll x,k;
}tr[N<<];
int tot,root;
void work(int &cnt,int l,int r,ll x,ll k){
if(!cnt)cnt=++tot;
int mid=(l+r)>>;
if(!tr[cnt].x&&!tr[cnt].k){tr[cnt].x=x;tr[cnt].k=k;return;}
ll x1=calc(b[l],b[mid],x,k),x2=calc(b[l],b[mid],tr[cnt].x,tr[cnt].k);
if(x1>=x2){
ll xx=tr[cnt].x,kk=tr[cnt].k;
tr[cnt].x=x;tr[cnt].k=k;
x=xx;k=kk;
}
if(l==r)return;
if(x>=tr[cnt].x)work(tr[cnt].l,l,mid,x,k);else work(tr[cnt].r,mid+,r,x+(b[mid+]-b[l])*k,k);
}
void upd(int &cnt,int l,int r,int L,int R,ll x,ll k){
if(!cnt)cnt=++tot;
if(l>=L&&r<=R){
work(cnt,l,r,x+(b[l]-b[L])*k,k);
return;
}
int mid=(l+r)>>;
if(mid>=L)upd(tr[cnt].l,l,mid,L,R,x,k);
if(mid<R)upd(tr[cnt].r,mid+,r,L,R,x,k);
}
}T1;
struct segment2{
struct seg{
int l,r;ll x,k;
}tr[N<<];
int tot,root;
void work(int &cnt,int l,int r,ll x,ll k){
if(!cnt)cnt=++tot;
int mid=(l+r)>>;
if(!tr[cnt].x&&!tr[cnt].k){tr[cnt].x=x;tr[cnt].k=k;return;}
ll x1=calc(b[l],b[mid],x,k),x2=calc(b[l],b[mid],tr[cnt].x,tr[cnt].k);
if(x1<=x2){
ll xx=tr[cnt].x,kk=tr[cnt].k;
tr[cnt].x=x;tr[cnt].k=k;
x=xx;k=kk;
}
if(l==r)return;
if(x<=tr[cnt].x)work(tr[cnt].l,l,mid,x,k);else work(tr[cnt].r,mid+,r,x+(b[mid+]-b[l])*k,k);
}
void upd(int &cnt,int l,int r,int L,int R,ll x,ll k){
if(!cnt)cnt=++tot;
if(l>=L&&r<=R){
work(cnt,l,r,x+(b[l]-b[L])*k,k);
return;
}
int mid=(l+r)>>;
if(mid>=L)upd(tr[cnt].l,l,mid,L,R,x,k);
if(mid<R)upd(tr[cnt].r,mid+,r,L,R,x,k);
}
}T2;
ll query(int x){
int now1=T1.root,now2=T2.root,l=,r=top;ll ans1=-1e15,ans2=1e15;
while(now1||now2){
int mid=(l+r)>>;
if(now1)ans1=max(ans1,calc(b[l],b[x],T1.tr[now1].x,T1.tr[now1].k));
if(now2)ans2=min(ans2,calc(b[l],b[x],T2.tr[now2].x,T2.tr[now2].k));
if(x<=mid)now1=T1.tr[now1].l,now2=T2.tr[now2].l,r=mid;
else now1=T1.tr[now1].r,now2=T2.tr[now2].r,l=mid+;
}
ans2=llabs(ans2);
return max(ans1,ans2);
}
int main(){
n=rd();m=rd();
for(int i=;i<=n;++i)pos[i]=rd(),now[i]=;
for(int i=;i<=m;++i){
t[i]=rd();scanf("%s",s);b[++top]=t[i];
if(s[]=='c'){
k[i]=rd(),x[i]=rd();
if(!now[k[i]])tag[k[i]]=i;
pre[i]=now[k[i]];la[now[k[i]]]=i;
now[k[i]]=i;
}
}
t[m+]=t[m]+;b[++top]=;b[++top]=t[m]+;
sort(b+,b+top+);
top=unique(b+,b+top+)-b-;
for(int i=;i<=m;++i)t[i]=lower_bound(b+,b+top+,t[i])-b;
for(int i=;i<=n;++i){
pre[m+]=now[i];la[now[i]]=m+;
if(!now[i])tag[i]=m+;
}
for(int i=;i<=n;++i){
int l=,r=t[tag[i]];
T1.upd(T1.root,,top,l,r,pos[i],);
T2.upd(T2.root,,top,l,r,pos[i],);
}
for(int i=;i<=m;++i){
if(k[i]){
int l=t[i],r=t[la[i]],la=t[pre[i]];
pos[k[i]]=pos[k[i]]+(b[l]-b[la])*x[pre[i]];
T1.upd(T1.root,,top,l,r,pos[k[i]],x[i]);
T2.upd(T2.root,,top,l,r,pos[k[i]],x[i]);
}
else printf("%lld\n",query(t[i]));
}
return ;
}

【集训队互测2015】Robot的更多相关文章

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

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

  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. UOJ#191. 【集训队互测2016】Unknown

    题意:维护一个数列,每个元素是个二维向量,每次可以在后面加一个元素或者删除一个元素.给定P(x,y),询问对于[l,r]区间内的元素$S_i$,$S_i \times P$的最大值是多少. 首先简单地 ...

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

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

随机推荐

  1. (摘)C#生成随机数的三种方法

    随机数的定义为:产生的所有数字毫无关系. 在实际应用中很多地方会用到随机数,比如需要生成唯一的订单号. 在C#中获取随机数有三种方法: 一.Random 类 Random类默认的无参构造函数可以根据当 ...

  2. layUI框架中文件上传前后端交互及遇到的相关问题

    下面我将讲述一下我在使用layUI框架中文件上传所遇到的问题: 前端jsp页面: <div class="layui-form-item"> <label cla ...

  3. javascript函数调用中的方法调用模式

    最近想起来之前看过的一种js语法,感觉很实用,但是又想不起来具体的写法.然后在网上浏览了一段时间,终于成功的再现了记忆中的那种语法,嗯~,还是那个熟悉的味道! 代码如下: <script> ...

  4. .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比

    Pop分组模式和表格模式对比 关键词: 驰骋工作流引擎  表单引擎  ccflow   .net开源工作流  jflow Java工作流引擎 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 a ...

  5. 每天五分钟-javascript数据类型

    javascript数据类型分为基本数据类型与复杂数据类型 基本数据类型包括:string,number,boolean,null,undefined,symbol(es6) 复杂数据类型包括:obj ...

  6. Android破解学习之路(十五)—— 【Unity3D】洛菲斯的呼唤(Lophis roguelike)无限金币(道具)的实现 破解

    前言 之前玩月圆之夜玩的挺high的,最近又找到了个与月圆之夜类似的卡牌游戏,游戏名为Lophis roguelike,中文翻译名洛菲斯的呼唤. 但是这个与月圆之夜有所不同,如果失败了,只能从开头重新 ...

  7. log4net使用封装,无缝切换 dotnet 和 dotnetcore

    log4net使用封装,无缝切换 dotnet 和 dotnetcore Intro 自己有几个自己的小项目,有许多公用的方法/扩展/工具类等等,于是封装了一些常用的工具类/扩展方法 WeihanLi ...

  8. mssql sqlserver with cte表达式(递归)找出最顶值的方法分享

    摘要: 下文通过递归的方式找出最顶级部门的方法分享,如下所示: 实验环境:sql server 2008 R2 下文通过cte-with表达式实现递归,获取一个公司的顶级部门,如下所示 例:部门表 c ...

  9. c#核心基础 - 浅谈 c# 中的特性 Attribute)

    特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.可以通过使用特性向程序添加声明性信息.一个声明性标签是通过放置在它所应用的元素前面 ...

  10. 彻底搞懂spark的shuffle过程(shuffle write)

    什么时候需要 shuffle writer 假如我们有个 spark job 依赖关系如下 我们抽象出来其中的rdd和依赖关系: E <-------n------,              ...