题目

Cirno初始有一个空的物品序列,一个大小为 \(V\) 的背包,现在你有 \(q\) 个操作,分为两种:

add \(x\) \(y\) : 表示加入一种体积为 \(x\), 价值为 \(y\) 的物品到序列末尾

erase : 表示删除序列末尾的物品

对于每个操作结束以后,你需要求出 :

假设序列中的每种物品都有无穷多个,Cirno的背包可以装下的物品最大价值和。

\(q,v\leq 2*10^4\)


分析

即使5s的限制,线段树分治也会超时

考虑删除实际上就是回溯到上一个版本,那么可以按照这样建一棵关系树,

直接按照这棵关系树跑就可以做到时间复杂度严格\(O(qv)\),但是会MLE,

考虑树链剖分的一个性质,一个点到根节点不会经过超过\(\log\)条轻边,

则只需要保留重儿子信息即可,空间复杂度\(O(v\log_2q)\)


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=20011; struct node{int y,next;}e[N];
int siz[N],big[N],dp[15][N],ans[N],as[N],et,rk[N],w[N],c[N],Q,m,n,Top,stac[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline signed max(int a,int b){return a>b?a:b;}
inline void dfs1(int x){
siz[x]=1;
for (rr int i=as[x],SIZ=-1;i;i=e[i].next){
dfs1(e[i].y),siz[x]+=siz[e[i].y];
if (SIZ<siz[e[i].y]) SIZ=siz[e[i].y],big[x]=e[i].y;
}
}
inline void dfs2(int x,int d,int las){
for (rr int i=0;i<w[x];++i) dp[d][i]=dp[las][i];
for (rr int i=w[x];i<=m;++i) dp[d][i]=max(dp[las][i],dp[d][i-w[x]]+c[x]);
ans[x]=dp[d][m];
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=big[x]) dfs2(e[i].y,d+1,d);
if (big[x]) dfs2(big[x],d,d);
}
signed main(){
Q=iut(),m=iut();
for (rr int i=1;i<=Q;++i){
rr char ch=getchar();
while (ch!='a'&&ch!='e') ch=getchar();
if (ch=='e') --Top,getchar(),getchar(),getchar(),getchar();
else {
w[++n]=iut(),c[n]=iut();
if (stac[Top]) e[++et]=(node){n,as[stac[Top]]},as[stac[Top]]=et;
stac[++Top]=n;
}
if (Top) rk[i]=stac[Top];
}
for (rr int i=1;i<=n;++i)
if (!siz[i]) dfs1(i),dfs2(i,1,0);
for (rr int i=1;i<=Q;++i) print(ans[rk[i]]),putchar(10);
return 0;
}

#树链剖分,背包#洛谷 5391 [Cnoi2019]青染之心的更多相关文章

  1. 洛谷 P5391 - [Cnoi2019]青染之心

    洛谷题面传送门 介绍一种假做法,期望复杂度应该比较优秀,但可以卡掉( 首先这个问题显然严格强于只有添加元素的情况对吧,而只有添加元素的情况就是一个普通的背包,而只有插入操作的版本复杂度就已经达到了 \ ...

  2. 【树链剖分】洛谷P3379 树链剖分求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  3. 树链剖分模板(洛谷P3384)

    洛谷P3384 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " < ...

  4. 树链剖分( 洛谷P3384 )

    我们有时候遇到这样一类题目,让我们维护树上路径的某些信息,这个时候发现我们无法用线段树或者树状数组来维护这些信息,那么我们就有着一种新的数据结构,树剖:将一棵树划分成若干条链,用数据结构去维护每条链, ...

  5. 【树链剖分】洛谷P3384树剖模板

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  6. 树链剖分【洛谷P4114】 Qtree1

    P4114 Qtree1 题目描述 给定一棵n个节点的树,有两个操作: CHANGE i ti 把第i条边的边权变成ti QUERY a b 输出从a到b的路径中最大的边权,当a=b的时候,输出0 码 ...

  7. 树链剖分【洛谷P2590】 [ZJOI2008]树的统计

    P2590 [ZJOI2008]树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把 ...

  8. 树链剖分【洛谷P1505】 [国家集训队]旅游

    P1505 [国家集训队]旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城 ...

  9. 树链剖分【洛谷P3833】 [SHOI2012]魔法树

    P3833 [SHOI2012]魔法树 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节 ...

  10. 洛谷 P3384 【模板】树链剖分

    树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...

随机推荐

  1. Redis高级系列详解

    01-Redis系列之-Redis介绍安装配置 02-Redis系列之-架构和高级API的使用 03-Redis系列之-高级用法详解 04-Redis系列之-持久化(RDB,AOF) 05-Redis ...

  2. SpringBoot面试题的零碎整理

    面试题1:简述一下Springboot相对SSM做了哪些提升? 首先,SpringBoot是采用"约定大于配置"(Convention over Configuration)的理念 ...

  3. 动态代码框架发布-CZGL.Roslyn

    CZGL.Roslyn 开源项目位置:https://github.com/whuanle/CZGL.CodeAnalysis 基于 Roslyn 技术的 C# 动态代码构建器以及编译器,开发者可以使 ...

  4. C/C++、C#、JAVA(三):字符串操作

    C/C++.C#.JAVA(三):字符串操作 目录 C/C++.C#.JAVA(三):字符串操作 定义字符串 C C++ C# JAVA 捕捉输入和输出 等值比较 C/C++ C# JAVA 字符串操 ...

  5. C++socket中select函数

    文章参考 https://www.cnblogs.com/shmilxu/p/4835873.html

  6. 50条MAUI踩坑记

    1. 目录结构: (1)_imports.razor是一个全局using namespace的地方 (2)Platforms下的代码,虽然都放在同一个项目下,但是Platforms\Android下的 ...

  7. 借助 Terraform 功能协调部署 CI/CD 流水线-Part 1

    在当今快节奏的开发环境中,实现无缝.稳健的 CI/CD 流水线对于交付高质量软件至关重要.在本文中,我们将向您介绍使用 Bitbucket Pipeline.ArgoCD GitOps 和 AWS E ...

  8. Nginx安装nginx-rtmp-module模块

    简介 nginx中的模块虽然就是类似插件的概念,但是它无法像VsCode那样轻松的安装扩展. nginx要安装其它模块必须同时拿到nginx源代码和模块源代码,然后手动编译,将模块打到nginx中,最 ...

  9. vue遇到拖拽动态生成组件怎么办?[转]

    知识点 主要是关注 动态生成 vue组件,这里是Vue2.0的demo Vue.Draggable 拖拽库 Vue.extend() 挂载 com.$mount() 生成组件 this.$refs.c ...

  10. 世界银行使用.NET 7开发的免费电子问卷制作系统Survey Solution

    Survey Solution (下文简称SS) 是世界银行数据部开发的一套免费电子问卷制作系统, 官网地址为: https://mysurvey.solutions/, github地址:https ...