bzoj千题计划220:bzoj3938: Robot
http://www.lydsy.com/JudgeOnline/problem.php?id=3938
以时间为x轴,以距离为y轴,那么每个机器人的行走路径就是一条折线
把折线分段加入线段树里,然后就是线段树维护单点一次函数最大值和最小值
调了半下午+一晚上一直在TTT
今早突然发觉,
之前用来贡献最大值的一次函数和最小值的一次函数都放在了一颗线段树里
下传的时候,同时更新最大值和最小值,
导致只需要更新最小值的一次函数的时候也更新了最大值的一次函数
由于永久标记虽然不会出错,但过多的下放标记浪费了时间
改成两颗线段树,马上就A了
我算不算体验到了 昏天黑地调代码一直TTT一觉起来灵机一动就A了的 激动???
要不是在学校机房我就大叫了,哈哈哈哈哈哈哈哈哈哈哈
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm> using namespace std; typedef long long LL; #define N 100001 struct node
{
int t,v;
node(int t=,int v=):t(t),v(v) {}
}e[N*]; int cnt,nxt[N*],ed[N]; int q[N*];
LL pos[N]; int root,tot;
int ROOT,TOT; struct TREE
{
int mxA;
int lc,rc;
LL mxB;
}TR[N*]; struct tree
{
int miA;
int lc,rc;
LL miB;
}tr[N*]; LL ans; template<typename T>
void read(T &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} void DOWN(int &k,int l,int r,int a,LL b)
{
if(!k) k=++TOT;
int mid=l+r>>;
if(!TR[k].mxA && !TR[k].mxB)
{
TR[k].mxA=a;
TR[k].mxB=b;
}
else if(l==r) TR[k].mxB=max(TR[k].mxB,b);
else
{
LL minow,mipre,mxnow,mxpre;
minow=min(b,1LL*(r-l)*a+b);
mxnow=max(b,1LL*(r-l)*a+b);
mipre=min(TR[k].mxB,1LL*(r-l)*TR[k].mxA+TR[k].mxB);
mxpre=max(TR[k].mxB,1LL*(r-l)*TR[k].mxA+TR[k].mxB);
if(minow>=mxpre)
{
TR[k].mxA=a;
TR[k].mxB=b;
}
else if(mipre>=mxnow);
else if(1LL*a*(mid-l)+b>1LL*TR[k].mxA*(mid-l)+TR[k].mxB)
{
if(TR[k].mxB>b) DOWN(TR[k].lc,l,mid,TR[k].mxA,TR[k].mxB);
else DOWN(TR[k].rc,mid+,r,TR[k].mxA,1LL*(mid+-l)*TR[k].mxA+TR[k].mxB);
TR[k].mxA=a;
TR[k].mxB=b;
}
else
{
if(TR[k].mxB>b) DOWN(TR[k].rc,mid+,r,a,1LL*a*(mid+-l)+b);
else DOWN(TR[k].lc,l,mid,a,b);
}
}
} void down(int &k,int l,int r,int a,LL b)
{
if(!k) k=++tot;
int mid=l+r>>;
if(!tr[k].miA && !tr[k].miB)
{
tr[k].miA=a;
tr[k].miB=b;
}
else if(l==r) tr[k].miB=min(tr[k].miB,b);
else
{
LL minow,mipre,mxnow,mxpre;
minow=min(b,1LL*(r-l)*a+b);
mxnow=max(b,1LL*(r-l)*a+b);
mipre=min(tr[k].miB,1LL*(r-l)*tr[k].miA+tr[k].miB);
mxpre=max(tr[k].miB,1LL*(r-l)*tr[k].miA+tr[k].miB);
if(mxnow<=mipre)
{
tr[k].miA=a;
tr[k].miB=b;
}
else if(mxpre<=minow);
else if(1LL*a*(mid-l)+b>1LL*tr[k].miA*(mid-l)+tr[k].miB)
{
if(tr[k].miB<b) down(tr[k].rc,mid+,r,a,1LL*(mid+-l)*a+b);
else down(tr[k].lc,l,mid,a,b);
}
else
{
if(tr[k].miB<b) down(tr[k].lc,l,mid,tr[k].miA,tr[k].miB);
else down(tr[k].rc,mid+,r,tr[k].miA,1LL*tr[k].miA*(mid+-l)+tr[k].miB);
tr[k].miA=a;
tr[k].miB=b;
}
}
} void CHANGE(int &k,int l,int r,int opl,int opr,int a,LL b)
{
if(!k) k=++TOT;
if(l==opl && r==opr)
{
DOWN(k,l,r,a,b);
return;
}
int mid=l+r>>;
if(opr<=mid) CHANGE(TR[k].lc,l,mid,opl,opr,a,b);
else if(opl>mid) CHANGE(TR[k].rc,mid+,r,opl,opr,a,b);
else
{
CHANGE(TR[k].lc,l,mid,opl,mid,a,b);
CHANGE(TR[k].rc,mid+,r,mid+,opr,a,1LL*(mid+-opl)*a+b);
}
} void change(int &k,int l,int r,int opl,int opr,int a,LL b)
{
if(!k) k=++tot;
if(l==opl && r==opr)
{
down(k,l,r,a,b);
return;
}
int mid=l+r>>;
if(opr<=mid) change(tr[k].lc,l,mid,opl,opr,a,b);
else if(opl>mid) change(tr[k].rc,mid+,r,opl,opr,a,b);
else
{
change(tr[k].lc,l,mid,opl,mid,a,b);
change(tr[k].rc,mid+,r,mid+,opr,a,1LL*(mid+-opl)*a+b);
}
} void QUERY(int k,int l,int r,int pos)
{
if(!k) return;
if(l==r)
{
ans=max(ans,TR[k].mxB);
return;
}
ans=max(ans,1LL*(pos-l)*TR[k].mxA+TR[k].mxB);
int mid=l+r>>;
if(pos<=mid) QUERY(TR[k].lc,l,mid,pos);
else QUERY(TR[k].rc,mid+,r,pos);
} void query(int k,int l,int r,int pos)
{
if(!k) return;
if(l==r)
{
ans=max(ans,-tr[k].miB);
return;
}
ans=max(ans,-(1LL*(pos-l)*tr[k].miA+tr[k].miB));
int mid=l+r>>;
if(pos<=mid) query(tr[k].lc,l,mid,pos);
else query(tr[k].rc,mid+,r,pos);
} int main()
{
//freopen("data.in","r",stdin);
//freopen("my.out","w",stdout);
int n,m,k,x,t;
char s[];
read(n); read(m);
for(int i=;i<=n;++i)
{
read(pos[i]);
ed[i]=i;
e[i].t=;
e[i].v=;
}
cnt=n;
int sum=;
int last;
while(m--)
{
read(t);
scanf("%s",s);
if(s[]=='q') q[++sum]=t;
else
{
read(k); read(x);
e[++cnt].v=x; e[cnt].t=t;
nxt[ed[k]]=cnt;
ed[k]=cnt;
}
last=t;
}
for(int i=;i<=n;++i)
{
e[++cnt].t=last;
e[cnt].v=;
nxt[ed[i]]=cnt;
ed[i]=cnt;
}
int siz;
for(int i=;i<=n;++i)
{
int j;
for(j=i;j!=ed[i];j=nxt[j])
{
CHANGE(ROOT,,last,e[j].t,e[nxt[j]].t,e[j].v,pos[i]);
change(root,,last,e[j].t,e[nxt[j]].t,e[j].v,pos[i]);
pos[i]+=1LL*(e[nxt[j]].t-e[j].t)*e[j].v;
}
}
for(int i=;i<=sum;++i)
{
ans=;
QUERY(ROOT,,last,q[i]);
query(root,,last,q[i]);
printf("%lld\n",ans);
}
}
bzoj千题计划220:bzoj3938: Robot的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
随机推荐
- Mac上使用虚拟机搭建Hadoop集群
一. mini安装一台centos到虚拟机上 安装过程参考这篇博客http://www.linuxdown.net/install/setup/2015/0906/4053.html 二. 修改网络配 ...
- 【洛谷1026】【NOIP2001】统计单词个数
题面 题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包 ...
- 论文笔记(7):Constrained Convolutional Neural Networks for Weakly Supervised Segmentation
UC Berkeley的Deepak Pathak 使用了一个具有图像级别标记的训练数据来做弱监督学习.训练数据中只给出图像中包含某种物体,但是没有其位置信息和所包含的像素信息.该文章的方法将imag ...
- jQuery 事件代理时的this
在jQuery使用on方法进行事件代理的时候,this是有多种变化的.下面开始对其进行研究 HTML的代码: <ul id="selected-plays" class=&q ...
- webpack开发环境配置和生产环境配置
开发环境配置 在开发环境下,我们首先考虑的是方便开发,方便代码调试,不需要考虑代码合并和css样式分离这些. 这里主要说三个 :1.css模块化:2.模块热替换功能:3.source-map(代码映射 ...
- 读书笔记-浅析Java运行时数据区
作为一个 Java 为主语言的程序员,我偶尔也需要 用 C/C++ 写程序,在使用时让我很烦恼的一件事情就是需要对 new 出来的对象进行 delete/free 操作,我老是担心忘了这件事情,从而导 ...
- js改变盒子大小(上下左右)分析
js改变盒子大小 知识点 三个mouse事件:mousedown mousemove mouseup css的定位和cursor 思路 先解决单边问题识别范围,得到所选区域 event. 根据距离,判 ...
- Eslint报错整理与解决方法(持续整理)
1.'Unexpected tab character' 字面意思理解呢就是意想不到的制表符,当时出现的时候就是我习惯的使用Tab键去打空格,但是eslint默认不认可Tab,所以解决方法很简单: 在 ...
- c标准头文件
好多C语言库函数参考还是用的TC的库函数参考,因此特地把现在C语言(C99)标准库函数的24个头文件列表如下:assert.h types.h(C99) signal.h stdlib.h c ...
- Jersey+mybatis实现web项目第一篇
---恢复内容开始--- Jesery第一篇:实现Jesery前后台页面交互,Form表单提交,后台控制页面跳转 该项目中有实现的功能: Mybatis实现后台数据持久化 Jersey页面数据提交 后 ...