【集训队互测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给出了 ...
随机推荐
- asp.net Core HttpClient 出现Cannot access a disposed object. Object name: 'SocketsHttpHandler' 的问题。
ASP.NET Core 部署在Centos 中 偶尔出现 One or more errors occurred. (Cannot access a disposed object.Object n ...
- nginx系列8:反向代理和负载均衡原理
反向代理是nginx的一个非常重要的功能. 反向代理 nginx支持四层反向代理和七层反向代理,如下图. 负载均衡 负载均衡是实现服务高性能和高可用的重要手段,而nginx是实现负载均衡的重要工具.
- ASP.NET学习笔记 —— 一般处理程序之图片上传
简单图片上传功能目标:实现从本地磁盘读取图片文件,展示到浏览器页面.步骤:(1). 首先创建一个用于上传图片的HTML模板,命名为ImageUpload.html: <!DOCTYPE html ...
- Aspnet mvc移除WebFormViewEngine
为了提高mvc的速度,在Global.asax中移除WebFormViewEngine protected void Application_Start() { RemoveWebFormEngine ...
- windows10安装mysql-8.0.13(zip安装)
安装环境说明 系统版本:windows10 mysql版本:mysql-8.0.13-winx64.zip 下载地址:http://mirrors.163.com/mysql/Downloads/My ...
- Linux(CentOS7)压缩和解压缩war包、tar包、tar.gz包命令
一.Linux版本 二.解压缩.tar.gz包到当前目录 tar -xzvf apache-tomcat-7.0.90.tar.gz 三.将指定文件压缩成.tar.gz包 tar -czf apach ...
- scrapy CrawlSpider解析
CrawlSpider继承自Spider, CrawlSpider主要用于有规则的url进行爬取. 先来说说它们的设计区别: SpiderSpider 类的设计原则是只爬取 start_urls 中的 ...
- from语法导入
"""# 在执行文件中能不能直接使用模块中的名字 # import m1# import m1 as m# print(m1.a)# print(m1.b)# print ...
- springmvc源码分析——入门看springmvc的加载过程
本文将分析springmvc是如何在容器启动的时候将各个模块加载完成容器的创建的. 我知道在web.xml文件中我们是这样配置springmvc的: 可以看到,springmvc的核心控制器就是Dis ...
- openstack第六章:dashboard
第六篇horizon— Web管理界面 一.horizon 介绍: 理解 horizon Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 ...