【集训队互测2015】Robot
题目描述
题解
维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了。
注意卡常,不要写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的更多相关文章
- BZOJ3938 & UOJ88:[集训队互测2015]Robot——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3938 http://uoj.ac/problem/88 小q有n只机器人,一开始他把机器人放在了一 ...
- 【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\) 的圆上的整点数量, ...
- UOJ#191. 【集训队互测2016】Unknown
题意:维护一个数列,每个元素是个二维向量,每次可以在后面加一个元素或者删除一个元素.给定P(x,y),询问对于[l,r]区间内的元素$S_i$,$S_i \times P$的最大值是多少. 首先简单地 ...
- EZ 2018 05 06 NOIP2018 慈溪中学集训队互测(五)
享受爆零的快感 老叶本来是让初三的打的,然后我SB的去凑热闹了 TM的T2写炸了(去你妹的优化),T1连-1的分都忘记判了,T3理所当然的不会 光荣革命啊! T1 思维图论题,CHJ dalao给出了 ...
随机推荐
- layer.photos()异步修改图片地址后显示异常
项目中有一个图片有预览(用的layer.photos()),需要异步修改图片地址,但是成功修改后第一次预览会显示修改前的大图,第二次以后就都正常了. 尝试修改成功后再次调用layer.photos() ...
- select设置text的值选中(兼容ios和Android)基于jquery
前一段时间改了一个bug,是因为select引起的.当时我没有仔细看,只是把bug改完了就完事了,今天来总结一下. 首先说option中我们通常会设置value的属性的,还有就是text值的,请参见下 ...
- 如何利用GitHub设计一个炫酷的个人网站(含代码)
1.在开始制作之前我们先预览一下我的网站吧! 1.方式一: 由于是手机版的所以用手机访问下面的链接体验比较好一点: https://tom-shushu.github.io/MyWeb.github. ...
- element表格添加查看操作
表格代码:黄色部分关键代码 首先看效果: <el-table :data="tableData" border height="480" style=&q ...
- 复活广州.net俱乐部
上个月张队长在深圳搞了一场活动,我们广州这边的.net粉丝也去了几个,我刚好有辆破车,于是我们一车会合后出发去深圳参加活动了,和大家在车上的交流使我感触良多.只说几点和本文相关的: .net在中国的生 ...
- Linux使用nginx反向代理。可实现域名指向特定端口
在配置80指向域名的时候出现端口占用,使用kill -9无法杀死端口,应使用下面的命令来杀死进程killall -9 nginx(使用完本命令需要再把配置过的配置文件重新启动.命令写在了PS下面)后在 ...
- dede首页、列表页调用非缩略图
在include/extend.func.php末尾添加 function firstimg($str_pic) { $str_sub=substr($str_pic,0,-7).strrchr($s ...
- char在C语言一个字节表示的数据范围
#include <stdio.h> //char类型数据范围 [-128,127] // ......-132 -131 -130 -129 -128 .. 127 128 129 13 ...
- qt5.11.2+vs2017环境下opencv3.4.1编译配置
OpenCV是一个开源的计算机库,它可以帮助视觉工作者做很多富有创造性的工作,在图像处理领域扮演着重要的角色.由于opencv3.x的存在,不管你是学生还是研究人员,是专家还是初学者,都可以快速的建立 ...
- 使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js
前言:前端小白一枚,刚注册博客,先发个学习过程中新碰到小问题试试水吧~ 摘要:最近在学习bootstrap,偶然碰到了一个小问题,bootstrap网站也没有做过多的解释,今天分享给大家. 问题描述: ...