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的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. [HAOI2010]软件安装

    简单的tarjan+(本蒟蒻刚刚接触不久)恶心的树形DP 题面 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为 ...

  2. Vue-自定义事件之—— 子组件修改父组件的值

    如何利用自定义的事件,在子组件中修改父组件里边的值? 关键点记住:三个事件名字 步骤如下: 这里,相对本案例,父组件定义为Second-module,对应的子组件是Three-module 第一步:你 ...

  3. iOS开发——下载器的功能基本实现

    今天,做了一个下载器的Demo,即从本地配置的Apache服务器上,下载指定的文件.这次,我们下载服务器根目录下的html.mp4文件. 按照惯例,我们先创建一个URL对象和请求. NSURL *ur ...

  4. 【最新】Power BI混合现实应用Mixed Reality app预览版正式发布

    1.介绍 2018年3月13日,Power BI在官方博客和Docs文档发布了Power BI for Mixed Reality应用预览版的消息, 也就是可以以后在更虚拟的世界中来观察你的报表,想象 ...

  5. TP90 95 99指标

    备忘下: 保证90%请求都能被响应的最小耗时 The tp90 is a minimum time under which 90% of requests have been served. tp90 ...

  6. Hive数据仓库笔记(二)

    分区和桶:   分区:可以提高查询的效率,只扫描固定范围数据,不用全部扫描 CREATE TABLE logs (ts BIGINT, lineSTRING) PARTITIONED BY (dt S ...

  7. Pythonic

    这个词翻译过来就是 这很python,其产生的目的就是写出更简洁的,没有冗余的python代码. 1.元素交换 a, b = b, a 看到网上有人解释的很好,首先,建立元组的重点不在于括号'()', ...

  8. Intellij +Maven 报错: Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.

    在intellij使用 Maven Project 测试时,运行test时看到log里的报错信息: -Dmaven.multiModuleProjectDirectory system propert ...

  9. USB协议基础知识笔记

    usb协议 功能层: 控制传输.中断传输.块传输(批量传输).同步传输 设备层:管理USB设备.分配地址.读取设备描述符 总线接口层:采用NRZI编码-反向非归零编码(0将前一个电平翻转,1不翻转) ...

  10. Ubuntu下sudo命令出现无法解析主机名

    替换hosts文件后sudo命令提示 无法解析主机名 把hosts文件中127.0.0.1后的名字改为主机名,即 /etc/hostname 中的名字