题目描述

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. winform登录功能

    private void btnLogin_Click(object sender, EventArgs e) { string username = txtUserName.Text; string ...

  2. WPF ResourceDictionary 主题资源替换(一)

    当我们需要在程序中替换主题,更换另一套背景.颜色.样式时,如何在不修改资源Key值,直接替换呢? 问题&疑问 1. Key值冲突 同一ResourceDictionary中,不可以使用相同Ke ...

  3. 弹性布局--flex方向

    flex方向 flex方向由flex-direction特性决定,用于定义弹性布局模式.flex-direction共有4种模式:从左向右.从右向左.从上往下.从下往上. 主轴 主轴的起点与终点定义了 ...

  4. Android项目实战欢迎界面

    欢迎界面 首先同理把欢迎界面的图片导入到drawable目录下,在导入时 Android Studio 会提示如下 drawable 具体本人尚未弄明白,待理解后会重新补全本部分内容,在此本人选了第一 ...

  5. node.js微信小程序配置消息推送

    在开发微信小程序时,有一个消息推送,它的解释是这样的. 消息推送具体的内容是下面的这个网址   https://developers.weixin.qq.com/miniprogram/dev/fra ...

  6. web测试之功能测试总结

    web测试是什么? web测试就是基于BS架构的软件产品的测试,通俗点来说就是web网站的测试 web功能测试包括哪些方面? 功能测试主要包括6大部分: 1.链接测试 2.表单测试 3.搜索测试 4. ...

  7. SQLServer修改登陆账户信息

    修改登陆账户信息注意事项 如果 CHECK_POLICY设置为ON,则无法使用 HASHED参数. 如果 CHECK_POLICY更改为ON,则将出现以下行为: 用当前的密码哈希值初始化密码历史记录. ...

  8. Docker容器镜像删除

    好吧,本来认为删除镜像是一件很容易的事情,但刚开始上手,还是有点百思不得其解.删着删着,发现果然很容易.分享下本人的心得: 分两种情况:那么要删除镜像,首先得删除容器,删除容器时,确保容器已停止运行: ...

  9. 修改rpm中的文件重新打包

    1.安装rpmrebuild 和安装rpmbuild rpmrebuild下载链接:https://sourceforge.net/projects/rpmrebuild/files/rpmrebui ...

  10. RAC Wait Event: gcs log flush sync 等待事件 转

    RAC Wait Event: gcs log flush sync https://www.hhutzler.de/blog/rac-wait-event_gcs_log_flush_sync/#o ...