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的子节点 那么 ...
随机推荐
- JavaScript保留关键字2。
一些不做解释的关键字是在js中预留的东西. abstract 抽象 . arguments 参数 标识符arguments是指向实参对象的引用,实参对象是一个类数组对象. boolean 布尔值. ...
- 【BZOJ1040】骑士(动态规划)
[BZOJ1040]骑士(动态规划) 题面 BZOJ 题解 对于每一组厌恶的关系 显然是连边操作 如果是一棵树的话 很显然的树型\(dp\) 但是,现在相当于有很多个基环 也就是在一棵树的基础上再加了 ...
- 【BZOJ2243】【SDOI2011】染色(树链剖分,线段树)
题面 我们也要换个花样,这回提供洛谷的题面 题解 线段树+树链剖分大水题 维护颜色段的方法很简单呀... 维护当前区间内的颜色段个数, 以及当前区间左端和右端的颜色, 合并的时候考虑是否要减一下就行了 ...
- jquery中的ajax方法参数
引用来自:http://www.cnblogs.com/tylerdonet/p/3520862.html jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String ...
- 关于JDK和eclipse的安装和汉化
参考网址:http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html http://titanseason.iteye.com/blo ...
- JDK的安装和Java环境变量配置
所需工具:JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
- CucumberJS 资源
https://cucumber.io/docs/reference/javascript https://github.com/cucumber/cucumber-js
- Windows Server 2019 预览版介绍
在Windows server 2012.Windows server 2016还未完全普及的情况下,昨天Windows Server团队宣布Windows Server 2019将在2018年的下半 ...
- NGINX压力测试
目录 1 硬件配置 3 1.1 型号 3 1.2 CPU 3 1.3 内存 3 2 软件环境 3 2.1 操作系统 3 2.2 ...
- 1-2 Spring 的基本使用
1.Spring容器的配置文件applicationContext.xml的引入 名称可以自己定义 <?xml version="1.0" encoding="UT ...