【集训队互测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给出了 ...
随机推荐
- PHP基础笔记
今天一个阳光明媚的大周天,小崔百无聊赖的翻看着各种老旧的经典电影,无奈谁让自己是没女朋友的单身狗呢.闲来无事就记录一下PHP的一些基础知识吧! 1.PHP是什么? PHP是一种创建动态交互性站点的服务 ...
- JavaScript是如何工作的:引擎,运行时和调用堆栈的概述!
摘要: 理解JS执行原理. 原文:JavaScript是如何工作的:引擎,运行时和调用堆栈的概述! 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 本文是旨在深入研究JavaScrip ...
- Django之模板系统
变量的使用: def test(request): num=1 s='hello' li=[1,2,['a','b']] dic={'name':'w','age':1} se={1,2,3} tup ...
- 在Docker中体验数据库之MySql
在上一篇在Docker中体验数据库之Mongodb之后,这次记录一下在docker中安装mysql.过程要比Mongodb麻烦一点…… 参考网址: https://dev.mysql.com/doc/ ...
- jsp页面中include静态html出现乱码问题的解决方式
这个问题出现过两次,上次没有做好记录,今天又出现了.不过这两次的情景也不完全一致. 今天通过搜索找到这篇文章的解决方式很好,可供参考.原博客地址http://blog.csdn.net/izgnaw/ ...
- java优先级队列的使用 leecode.703.数据流中的第K大元素
//设计一个找到数据流中第K大元素的类(class). //注意是排序后的第K大元素,不是第K个不同的元素. class KthLargest { private PriorityQueue<I ...
- SQLServer删除登录帐户
删除登陆账户注意事项 不能删除正在登录的登录名. 也不能删除拥有任何安全对象.服务器级对象或 SQL Server 代理作业的登录名. 可以删除数据库用户映射到的登录名,但是这会创建孤立用户. 有关详 ...
- eclipse 导入gradle引入多模块项目,引入eclipse后变成了好几个工程
1.eclipse 导入gradle 项目 ,选择项目文件夹. 2.导入完成后,文档结构变成 ,多个子项目并列了,而且互不依赖,没有层级结构了. 3.点击项目目录,右上角这个小箭头,选择projec ...
- Ubuntu 16.04 安装GIMP绘图软件
Ubuntu上比较好用的绘图软件,GIMP,安装方法如下: 终端输入 : sudo apt-get install gimp ,回车,输入密码,即可安装简单易行. 输入 :gimp ,启动程序.
- docker镜像和容器的导出导入
本文介绍docker镜像和容器的导入导出,用于迁移.备份.升级等场景.主要用到export.import.save.load四个方法. 原文地址:代码汇个人博客 http://www.codehui. ...