首页 > 其他分享 >「CF1455G」Forbidden Value 题解 (DP,线段树合并)

「CF1455G」Forbidden Value 题解 (DP,线段树合并)

时间:2022-10-04 19:23:14浏览次数:70  
标签:rt cnt int 题解 top Value 2e5 Maxn DP

题目简介

已知初始值 \(x=0\) ,给定下面 \(2\) 种命令:

  1. set \(y\) \(v\),令 \(x=y\),或花费 \(v\) 元钱删除该命令;
  2. if \(y\) ... end,如果 \(x==y\),执行if...end中的命令,否则跳过该if...end

你需要使用最少的花费,使得无论运行到哪里,都有 \(x \neq s\)。

分析

其实我们可以在整个操作最外面套一个 if \(0\) … end 操作。这样所有的命令就可以化作一颗树的结构。

考虑 \(f[i][j]\) 为以 \(i\) 为根的子树中,操作完结果 \(x=j\) 的方案的最小花费。特别的,\(f[i][s]=\infin\)

如果当前结点为1操作,那么有:

\(f[i][y]=\min f[i][z] (y\ne s\ \mbox{and}\ z\ne y)\)

\(f[i][z]=f[i][z]+v(z\ne y)\)

如果当前结点为2操作,那么先对其子树做递归一遍,在进行合并:

\(f[i][y]=f[i'][y]\)

\(f[i][z]=\min {f[i][z],f[i'][z]}\)

解释一下为什么 \(f[i][y]\neq \min\ f[i][y],f[i'][y]\)。原因是发现 \(f[i][y]\) 可行后,是必须行走 \(f[i'][y]\)。而其他都是可选择的。

但是这样的数组显然是开不下的,考虑使用线段树合并来维护信息。

\(AC\ Code\)

#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
using ll=long long;
const int Maxn=2e5+5;
const ll Inf=1e18;
int lson[Maxn<<4];
int rson[Maxn<<4];
ll val[Maxn<<4];
ll laz[Maxn<<4];
int tot;
inline int &ls(int x){return lson[x];}
inline int &rs(int x){return rson[x];}
inline void add(int x,ll v){val[x]+=v;laz[x]+=v;}
inline void pushup(int x){
	val[x]=min(val[ls(x)],val[rs(x)]);
}
inline void pushdown(int x){
	if(!laz[x])return ;
	if(ls(x))add(ls(x),laz[x]);
	if(rs(x))add(rs(x),laz[x]);
	laz[x]=0;
}
void modify(int &x,int l,int r,int p,ll v){
	if(!x)val[x=++tot]=Inf;
	if(l==r){val[x]=v;return ;}
	pushdown(x);
	int mid=l+r>>1;
	if(p<=mid)modify(ls(x),l,mid,p,v);
	else modify(rs(x),mid+1,r,p,v);
	pushup(x);
}
ll query(int x,int l,int r,int p){
	if(!x)return Inf;
	if(l==r){return val[x];}
	pushdown(x);
	int mid=l+r>>1;
	if(p<=mid)return query(ls(x),l,mid,p);
	else return query(rs(x),mid+1,r,p);
}
void merge(int &x,int y,int l,int r){
	if(!x||!y){x+=y;return ;}
	if(l==r){val[x]=min(val[x],val[y]);return ;}
	pushdown(x);pushdown(y);
	int mid=l+r>>1;
	merge(ls(x),ls(y),l,mid);
	merge(rs(x),rs(y),mid+1,r);
	pushup(x);
}
int op[Maxn],cnt;
int a[Maxn],b[Maxn];
int rt[Maxn];
int st[Maxn],top;
vector<int>tr[Maxn];
void dfs(int x,int k){
	modify(rt[x],0,2e5,a[x],0);
	for(int y:tr[x]){
		if(op[y]==1){
			ll tmp=val[rt[x]];
			add(rt[x],b[y]);
			if(a[y]!=k)
				modify(rt[x],0,2e5,a[y],tmp);
		}else{
			ll tmp=query(rt[x],0,2e5,a[y]);
			if(tmp!=Inf){
				dfs(y,k);
				add(rt[y],tmp);
				modify(rt[x],0,2e5,a[y],Inf);
				merge(rt[x],rt[y],0,2e5);
			}
		}
	}
}
int main(){
	int n,m;cin>>n>>m;
	st[++top]=++cnt;
	for(int i=1;i<=n;++i){
		char s[5];cin>>s;
		if(s[0]=='s'){
			op[++cnt]=1;
			cin>>a[cnt]>>b[cnt];
			tr[st[top]].emplace_back(cnt);
		}else if(s[0]=='i'){
			op[++cnt]=2;
			cin>>a[cnt];
			tr[st[top]].emplace_back(cnt);
			st[++top]=cnt;
		}else --top;
	}
	val[0]=Inf;dfs(1,m);
	cout<<val[rt[1]]<<'\n';
	return 0;
}

$$-----EOF-----$$

标签:rt,cnt,int,题解,top,Value,2e5,Maxn,DP
From: https://www.cnblogs.com/wintersunny/p/16754262.html

相关文章

  • [题解]洛谷 P4930、BZOJ 4221
    洛谷P4930考虑\(\varphi\)有什么性质,设\(x\)的质因数分解为\(\prod_{i=1}^mp_i^{a_i}\),那么\(n=\varphi(x)=\prod_{i=1}^m(p_i-1)\times\prod_{i=1}^mp_i^{a_i-1......
  • 「ROIR 2021 Day 1」题解
    loj有原题。别问为什么没T4,问就是不会,等以后来补。T1-两台机器设两台机子分别为\(a,b\),分\(4\)种情况:只用\(a\),只用\(b\),先\(a\)后\(b\),先\(b\)后\(a\),判断......
  • C# UdpClient发送超过1500字节MTU的数据包会怎么样
    如果不设置DontFragmentudpClient.DontFragment=false;那么可以发送数据包。接收端随缘收到数据包。使用WireShark可以检测到网卡上对应的数据包。如果设置DontFragm......
  • UDP程序设计
    UDP程序设计​无连接,不可靠的数据报协议-->简单,快捷域名系统,简单网络管理协议(SNMP),网络文件系统(NFS),动态主机配置协议(DHCP),实时传输协议RTP服务器端:创建socket......
  • 洛谷 CF550C Divisibility by Eight(DP/数论)
    遇事不决,小学数学。https://www.luogu.com.cn/problem/CF550C题目大意:给你一个位数不超过100的非负整数N(不含前导0)。你的任务是判断这个数字能否通过去掉其中......
  • TCP与UDP的联系与区别
    联系:1:TCP(TransmissionControlProtocol,传输控制协议)和UDP(UserDataProtocol,用户数据报协议)都属于TCP/IP协议簇2:TCP/IP协议集包括超文本传输协议(HTTP),文本传输协议(FTP......
  • dp----得到方案方法的技巧
    《题一》原题链接:https://atcoder.jp/contests/abc271/tasks/abc271_d翻译:问题陈述有N张卡片,每面写一个整数。卡片正面写着一个整数ai,背面写着一位整数bi。您可以选......
  • wordpress多节点部署+rsync备份图片
    基于LAMP架构搭建LB+web+mysql+nas架构,实现从web站点上传的图片自动同步(wordpress)环境:10.0.0.128apache+wordpress服务,数据库主库指向10.0.0.132,基于docker来安装,映射......
  • 0816-CDP Hive3升级说明
    文档编写目的CDH5中的Hive版本是1.1,而CDP7中的Hive版本为3。Hive3相对Hive1更新特别多,比如支持全新的ACIDv2机制,并且底层使用Tez和内存进行查询,相比MR的方式性能提升超过10......
  • 0805-CDH5中的Parquet迁移至CDP中兼容性验证
    文档编写目的因为CDH5中的Parquet版本为1.5,而CDP7中的Parquet版本为1.10,我们在从CDH5升级到CDP7后,无论是原地升级还是迁移升级,都可能会碰到一个问题,以前在CDH5中使用Hive/Im......