[bzoj4906][BeiJing2017]喷式水战改
来自FallDream的博客,未经允许,请勿转载,谢谢。
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define MN 500005
#define getchar() (*S++)
char BB[<<],*S=BB;
using namespace std;
inline int read()
{
int x = ; char ch = getchar();
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x;
}
inline ll llread()
{
ll x = ; char ch = getchar();
while(ch < '' || ch > '')ch = getchar();
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x;
}
struct data
{
ll x[][];
data(){}
data(ll a,ll b,ll c)
{
memset(x,,sizeof(x));
x[][]=x[][]=a;x[][]=b;
x[][]=c;x[][]=max(a,b);
x[][]=max(b,c);x[][]=max(a,c);
x[][]=x[][]=x[][]=max(a,max(b,c));
}
friend data operator + (data a,data b)
{
data c;memset(c.x,,sizeof(c.x));
for(int l=;l<=;++l)
for(int i=;i+l-<;++i)
{
int j=i+l-;c.x[i][j]=;
for(int k=i;k<=j;++k)
c.x[i][j]=max(c.x[i][j],a.x[i][k]+b.x[k][j]);
}
return c;
}
}s[MN+];
int fa[MN+],sz[MN+],c[MN+][],rt=,mark,A[MN+],L[MN+],B[MN+],C[MN+],n,cnt=,q[MN+],top=;
ll size[MN+],tot;
int tms=;
inline void update(int x)
{
s[x]=(data){1LL*A[x]*L[x],1LL*B[x]*L[x],1LL*C[x]*L[x]};
if(c[x][]) s[x]=s[c[x][]]+s[x];
if(c[x][]) s[x]=s[x]+s[c[x][]];
size[x]=size[c[x][]]+size[c[x][]]+L[x];
sz[x]=sz[c[x][]]+sz[c[x][]]+;
} int Find(int x,ll pos)
{
ll Sz1=size[c[x][]],Sz2=Sz1+L[x];
if((Sz1<pos||(!c[x][]&&!pos))&&Sz2>=pos) return x;
if(Sz1>=pos) return Find(c[x][],pos);
return tot+=Sz2,Find(c[x][],pos-Sz2);
} void ins(int&x,int ai,int bi,int ci,ll pos,int len,int last=)
{
if(!x)
{
x=++cnt;s[x]=data(1LL*ai*len,1LL*bi*len,1LL*ci*len);
L[x]=size[x]=len;A[x]=ai;B[x]=bi;C[x]=ci;sz[x]=;fa[x]=last;
return;
}
ll Sz=size[c[x][]]+L[x];
if(Sz<=pos) ins(c[x][],ai,bi,ci,pos-Sz,len,x);
else ins(c[x][],ai,bi,ci,pos,len,x);
update(x);
if(max(sz[c[x][]],sz[c[x][]])>0.7*sz[x]) mark=x;
} void Modify(int x,int k,ll pos,int Len)
{
if(x==k)
{
L[x]=Len;update(x);
return;
}
if(size[c[x][]]>=pos) Modify(c[x][],k,pos,Len);
else Modify(c[x][],k,pos-L[x]-size[c[x][]],Len);
update(x);
} void Dfs(int x)
{
if(c[x][]) Dfs(c[x][]);
q[++top]=x;
if(c[x][]) Dfs(c[x][]);
} void Build(int&x,int l,int r,int last)
{
if(l>r) {x=;return;}
int mid=l+r>>;x=q[mid];fa[x]=last;
Build(c[x][],l,mid-,x);
Build(c[x][],mid+,r,x);
update(x);
} void rebuild(int x)
{
mark=top=;Dfs(x);int y=fa[x];
if(!y) Build(rt,,top,);
else Build(c[y][c[y][]==x],,top,y);
} int main()
{
fread(BB,,<<,stdin);
n=read();ins(rt,,,,,);ll pre=;
for(int i=;i<=n;++i)
{
ll p=llread();
int ai=read(),bi=read(),ci=read(),x=read();
tot=tms=;int k=Find(rt,p);
if(tot+size[c[k][]]+L[k]!=p)
{
ll Left=tot+size[c[k][]]+L[k]-p;
tms=;Modify(rt,k,p,L[k]-Left);
ins(rt,ai,bi,ci,p,x);if(mark) rebuild(mark);
ins(rt,A[k],B[k],C[k],p+x,Left);
}
else ins(rt,ai,bi,ci,p,x);
printf("%lld\n",s[rt].x[][]-pre);
pre=s[rt].x[][];if(mark) rebuild(mark);
}
return ;
}
[bzoj4906][BeiJing2017]喷式水战改的更多相关文章
- BJOI2017 喷式水战改
题目链接. Description 维护一个序列,支持操作: 每次在 \(P_i\) 位置后插入一段 \(X_i\) 单位的燃料,这一段有三个模式,对应的能量分别是 \(A_i, B_i, C_i\) ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- Linux.NET实战手记—自己动手改泥鳅(上)
各位读者大家好,不知各位读者有否阅读在下的前一个系列<Linux.NET 学习手记>,在前一个系列中,我们从Linux中Mono的编译安装开始,到Jexus服务器的介绍,以及如何在Linu ...
- Linux.NET实战手记—自己动手改泥鳅(下)
在上回合中,我们不痛不痒的把小泥鳅的数据库从只能供在Windows下运行的Access数据库改为支持跨平台的MYSQL数据库,毫无营养的修改,本回合中,我们将把我们修改后得来的项目往Linux中部署. ...
- Android 打开方式选定后默认了改不回来?解决方法(三星s7为例)
Android 打开方式选定后默认了改不回来?解决方法(三星s7为例) 刚刚在测试东西,打开一个gif图,然后我故意选择用支付宝打开,然后...支付宝当然不支持,我觉得第二次打开它应该还会问我,没想到 ...
- 把PDF的底色改成护眼色,这样读起文章来就不是很累了······
PDF格式背景改变方法如下: 打开PDF 点击 编辑 ->首选项->辅助工具->选中"替换文档颜色"和" 自定义颜色"->将背景颜色改成 ...
- 3.EF 6.0 Code-First实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...
- 4.在MVC中使用仓储模式进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
随机推荐
- Flask 部署和分发
到目前为止,启动Flask应用都是通过"app.run()"方法,在开发环境中,这样固然可行,不过到了生产环境上,势必需要采用一个健壮的,功能强大的Web应用服务器来处理各种复杂情 ...
- poj2029 Get Many Persimmon Trees
http://poj.org/problem?id=2029 单点修改 矩阵查询 二维线段树 #include<cstdio> #include<cstring> #inclu ...
- Python之黏包的解决
黏包的解决方案 发生黏包主要是因为接收者不知道发送者发送内容的长度,因为tcp协议是根据数据流的,计算机操作系统有缓存机制, 所以当出现连续发送或连续接收的时候,发送的长度和接收的长度不匹配的情况下就 ...
- 将Tomcat添加进服务启动
tomcat有解压版和安装版2种版本,安装版已经做好了将tomcat添加进服务的操作,而解压版需要我们自己来实现,应用场景主要是在服务器端需要在服务器启动时就启动tomcat. 1.首先需要配置好jd ...
- JavaScript 克隆
JavaScript 克隆 本次学习内容: 克隆:只克隆标签和属性,不克隆文本. 克隆的功能,如果不添加使用Ture,就只会克隆标签和属性,不会克隆文本. 克隆的参数全部是节点对象,不能是字符串 &l ...
- JavaScript(js)/上
JavaScript(js) ECMA-----定义的基础语法 DOM------document object model BOM------Browser object model Jav ...
- urllib.parse.urlencode
urllib.request.urlopen(url,data,timeout) 其中如果data被赋值,则请求的方式就会由get转为post,而post需要提供一些待处理的数据. 这些待处理的数据需 ...
- jacascript 滚动 scroll 与回到顶部
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 滚动 scroll scrollHeight 表示元素的总高度,包括由于溢出而无法展示在网页的不可见部分: ...
- ubuntu 添加右键打开方式,无法添加程序打开方式
最近把工作环境迁移到ubuntu,装了WPS for Linux ,说实话确实是十分良心啊!运行效率奇高,绿色无广告,并且和windows版本无异,感觉就可以抛弃自带的libreoffice了. 但是 ...
- 全球性WannaCry蠕虫勒索病毒感染前后应对措施
前言:针对WannaCrypt勒索病毒的讨论和技术文章是铺天盖地,大量的技术流派,安全厂家等纷纷献计献策,有安全厂家开发各种安全工具,对安全生态来说是一个好事,但对个人未必就是好事,我们国家很多用户是 ...