[BJOI2017] 喷式水战改

news/2025/2/11 11:38:07/文章来源:https://www.cnblogs.com/Xdik/p/18709451

首先看到要插入序列,所以自然地想到平衡树,那么左儿子就是左边的序列,右儿子就是右边的序列,求这个值的朴素算法是dp吧,就是前 \(i\) 个燃料,已经到了第 \(j\) 阶段的最大值,但是因为左右儿子是一坨序列,我如果按照这样维护 \(dp\) 的话我也不知道右儿子开始的时候到了哪个阶段,所以很自然地想到区间dp,就是把状态改成这个 \(f_{p,l,r}\) 表示节点 \(p\) 的子树所对应的区间完成了 \(l,r\) 这个阶段所能获得的最大值,每次pushup的时候合并一下左右两个区间即可,我实现使用的是fhq

code:

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#pragma GCC optimeze(3)
#pragma GCC optimeze(2)
#define PII pair<int, int>
#define pb push_back
#define fi first
#define se second
#define lowbit(x) (x & (-x))
#define inv(x) (qpow(x,mod-2))
using namespace std;
const int N=4e5+10;
double eps=1e-6;
inline int read(){char ch=getchar();bool f=0;int x=0;for(;!isdigit(ch);ch=getchar())if(ch=='-')f=1;for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+(ch^48);if(f==1)x=-x;return x;
}
struct node{int ls,rs,w,siz,a[4],len,al;int f[5][5];
}tr[N];
int tot,n,root;
void newnode(int&id,int k,int a,int b,int c){id=++tot;tr[id].w=rand(),tr[id].siz=1,tr[id].al=tr[id].len=k;tr[id].a[1]=a,tr[id].a[2]=b,tr[id].a[3]=c;tr[id].f[1][1]=tr[id].a[1]*k;tr[id].f[2][2]=tr[id].a[2]*k;tr[id].f[3][3]=tr[id].a[3]*k;tr[id].f[4][4]=tr[id].a[1]*k;for(int i=1;i<=3;i++){for(int j=i+1;j<=4;j++){tr[id].f[i][j]=max(tr[id].f[i][j-1],tr[id].f[j][j]);}}
}
void pushup(int p){memset(tr[p].f,0,sizeof tr[p].f);int ok[5]={};int ls=tr[p].ls,rs=tr[p].rs;ok[1]=tr[p].f[1][1]=tr[p].a[1]*tr[p].len;ok[2]=tr[p].f[2][2]=tr[p].a[2]*tr[p].len;ok[3]=tr[p].f[3][3]=tr[p].a[3]*tr[p].len;ok[4]=tr[p].f[4][4]=tr[p].a[1]*tr[p].len;for(int i=1;i<=4;i++)tr[p].f[i][i]+=tr[ls].f[i][i]+tr[rs].f[i][i];for(int len=2;len<=4;len++){for(int l=1;l+len-1<=4;l++){int r=l+len-1;for(int i=l;i<=r;i++){tr[p].f[l][r]=max(tr[p].f[l][r],tr[ls].f[l][i]+ok[i]+tr[rs].f[i][r]);}}}tr[p].siz=tr[ls].siz+tr[rs].siz+1;tr[p].al=tr[ls].al+tr[rs].al+tr[p].len;
}
int merge(int x,int y){if(!x||!y)return x|y;if(tr[x].w<tr[y].w){tr[x].rs=merge(tr[x].rs,y);pushup(x);return x;}tr[y].ls=merge(x,tr[y].ls);pushup(y);return y; }
void split(int id,int cnt,int&x,int&y){if(!id){x=y=0;return;}if(tr[tr[id].ls].al+tr[id].len<cnt){x=id;split(tr[id].rs,cnt-(tr[tr[id].ls].al+tr[id].len),tr[x].rs,y);pushup(x);}else{y=id;split(tr[y].ls,cnt,x,tr[y].ls);pushup(y);}
}
void split2(int id,int k,int&x,int &y){if(!id){x=y=0;return;}if(tr[tr[id].ls].siz+1<=k){x=id;split2(tr[id].rs,k-tr[tr[id].ls].siz-1,tr[x].rs,y);pushup(x);}else{y=id;split2(tr[y].ls,k,x,tr[y].ls);pushup(y);}
}
signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);srand(time(0));cin>>n;int lst=0;while(n--){int p,a,b,c,x;cin>>p>>a>>b>>c>>x;int T1,T2,T3;split(root,p,T1,T2);if(tr[T1].al!=p){split2(T2,1,T3,T2);int a=tr[T3].a[1],b=tr[T3].a[2],c=tr[T3].a[3],len=tr[T3].len;int x,xx;newnode(x,p-tr[T1].al,a,b,c);newnode(xx,len-(p-tr[T1].al),a,b,c);T1=merge(T1,x),T2=merge(xx,T2);}int t;newnode(t,x,a,b,c);root=merge(merge(T1,t),T2);int ans=tr[root].f[1][4];cout<<ans-lst<<'\n';lst=ans;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882026.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署milvus2.5.3(standalone模式)

环境:os:Centos 7milvus:2.5.31.创建部署目录mkdir -p /home/middle/milvus2.准备docker-compose.yml配置文件内如如下: 我这里使用的是自己的镜像,需要根据自己环境情况进行修改[root@host135 milvus]# more docker-compose.yml version: 3.5services:etcd:container_name: m…

[书]清华大学DeepSeek:从入门到精通

通过网盘分享的文件:清华大学DeepSeek:从入门到精通.pdf等3个文件链接: https://pan.baidu.com/s/1y0-b3seTz7gMTTuPxYS7Vg?pwd=xd25 提取码: xd25一共三本资料

六. UML

UML 一. 事物 1.结构事物 结构事物是UML模型中的名词。它们通常是模型的静态部分,描述概念或物理元素。结构事物包括类(Class)、接口(Interface)、协作(Collaboration)、用例(Use Case)、主动类(Active Class)、构件(Component)、制品( Artifact)和结点(Node)。 各种结构事物的…

探索 QuestPDF:全平台支持、多功能、专业级的 .NET PDF 库

QuestPDF 是一个用于生成 PDF 文件的 .NET 库,它提供了一个简洁的 API 和灵活的布局选项,使得在 .NET 应用程序中创建 PDF 文件变得更加简单。 支持多平台,支持的功能有合并文档 附加文件 提取页面 加密/解密 扩展元数据 限制访问 针对 Web 进行优化 叠加层 / 底层安装 第一…

Java 中堆内存和栈内存上的数据分布和特点

说到 Java 中内存我们一般笼统地划分为堆内存(Heap)和栈内存(Stack),那么哪些数据被放置在堆内存?哪些数据被放置在栈内存?这些数据的分布有什么特点吗?博客:https://www.emanjusaka.com 博客园:https://www.cnblogs.com/emanjusaka 公众号:emanjusaka的编程栈by em…

AspNetCore 实战:三种流式响应机制详解

在现代Web应用中,实时数据传输和高效的数据流处理变得越来越重要。AspNetCore 提供了多种流式响应机制,以满足不同场景下的需求。 在使用ChatGpt,deepseek的适合有没有想过ai的逐字显示回答是怎么实现的,下面将介绍三种主要的流式响应来实现此功能。 Server-Sent Events (S…

java中反射-字节码和类加载器

多态的一个表现 子类类型赋值给父类 Father f1 = New Son() 调用子类方法报错。 调用父类方法OK。这个就是多态 一个对象能用什么方法,并不是取决于 它有什么方法。 而是取决于引用变量的类型(也就是取决于它声明的类型,Father类型) 它能够用的方法,一定是Father中的方法。 …

本地私有化部署DeepSeek,打造自己的大模型知识库

1简介 DeepSeek R1是基于MIT协议开源的大模型,意味着个人和企业可以免费使用,包括商业使用。 众所周知,我们可以在chat.deepseek.com上可以直接免费使用DeepSeek R1的聊天服务。但如果你自己开发的应用需要使用到其api的话,仍然是需要收费的,另外,如果你有机密信息并不想…

五. 数据库

数据库 一. 三级模式 一个数据库可以有多个外模式,只能有一个内模式。 视图对应外模式、基本表对应模式、存储文件对应内模式二. 两级映像 (1) 模式/内模式映像。存在于概念级和内部级之间,实现了概念模式和内模式之间的相互转换。 (2) 外模式/模式映像。存在于外部级和概念级…

Oracle 缩容量方法 --转发 https://www.modb.pro/db/1873006442018521088?utm_source=index_ai

1.系统表空间清理 SYSAUX表空间被称为系统辅助表空间,主要的目的是为SYSTEM表空间减负。1.1 表空间的使用率 比如大表大部分都是AUD$和WRH$开头的AWR基表,AUD$使用SYSTEM表空间,AWR的基表使用SYSAUX表空间。 SELECT df.tablespace_name, COUNT (*) datafile_count,ROUND (SUM…

轻松上手!小白必看:在你的个人电脑上安装DeepSeek R1 大模型

deepseek本地化部署,小白教程,让你的个人电脑也能安装运行大模型!一、deepseek简介 DeepSeek是一个强大的工具,它就像一个聪明的助手,能帮我们处理和分析大量信息。它适用于各种场合,比如理解文字、识别图片,还能根据你的喜好推荐东西。 这个工具很灵活,就像乐高积木,…

macOS Sequoia 15.3.1 (24D70) 正式版 ISO、IPSW、PKG 下载

macOS Sequoia 15.3.1 (24D70) 正式版 ISO、IPSW、PKG 下载macOS Sequoia 15.3.1 (24D70) 正式版 ISO、IPSW、PKG 下载 iPhone 镜像、Safari 浏览器重大更新和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接:https://sysin.org/blog/macOS-Sequoia/…