首页 > 其他分享 >acwing329 围栏障碍训练场 题解

acwing329 围栏障碍训练场 题解

时间:2024-06-04 21:00:56浏览次数:17  
标签:return rs int 题解 min 1e5 训练场 acwing329 dp

考试压轴题,意识到这题是线段树优化 \(dp\) 时追悔莫及。

为了简化题目,我将从起点到原点变成了从原点到起点(这样就可以省去两个数组的空间)。

想到设 \(dp_{i,j}\) 表示在第 \(i\) 层,奶牛们在 \(j\) 列时的最小移动范围,则转移方程为(设输入为 \(l,r\)):

\[\begin{cases} dp_{i,j}=dp_{i-1,j}\ (j\ne l,r)\\ dp_{i,l}=\min(dp_{i-1,l},\min\limits_{k=l+1}^{r-1}(dp_{i-1,k}+k-l))\\ dp_{i,r}=\min(dp_{i-1,r},\min\limits_{k=l+1}^{r-1}(dp_{i-1,k}+r-k)) \end{cases} \]

发现可以通过线段树优化 \(dp\),时间复杂度 \(O(n\log_2 2\times 10^5)\)。

#include<bits/stdc++.h>
#define ll long long
#define ls(x) x*2
#define rs(x) x*2+1
using namespace std;
const int N=2e6+5;
int n,s,lb[N];
int lmn[N],rmn[N];
void push_down(int x){
	if(!lb[x]) return;
	lb[ls(x)]=lb[rs(x)]=1;
	lmn[ls(x)]=rmn[ls(x)]=1e9;
	lmn[rs(x)]=rmn[rs(x)]=1e9;
	lb[x]=0;return;
}void build(int x,int l,int r){
	lmn[x]=rmn[x]=1e9;
	if(l==r) return;
	build(ls(x),l,(l+r-1)/2);
	build(rs(x),(l+r-1)/2+1,r);
}void add(int x,int l,int r,int a,int k){
	if(l==r){
		lb[x]=0;lmn[x]=min(lmn[x],k);
		rmn[x]=min(rmn[x],k);return;
	}push_down(x);int m=(l+r-1)/2;
	if(a<=m) add(ls(x),l,m,a,k);
	else add(rs(x),m+1,r,a,k);
	lmn[x]=min(lmn[ls(x)],lmn[rs(x)]+m-l+1);
	rmn[x]=min(rmn[ls(x)]+r-m,rmn[rs(x)]);
}int lmin(int x,int l,int r,int L,int R){
	if(L<=l&&r<=R) return lmn[x];
	push_down(x);int m=(l+r-1)/2;
	if(R<=m) return lmin(ls(x),l,m,L,R);
	if(L>m) return lmin(rs(x),m+1,r,L,R);
	int lm=lmin(ls(x),l,m,L,R);
	int rm=lmin(rs(x),m+1,r,m+1,R);
	return min(lm,rm+m-L+1); 
}int rmin(int x,int l,int r,int L,int R){
	if(L<=l&&r<=R) return rmn[x];
	push_down(x);int m=(l+r-1)/2;
	if(R<=m) return rmin(ls(x),l,m,L,R);
	if(L>m) return rmin(rs(x),m+1,r,L,R);
	int lm=rmin(ls(x),l,m,L,m);
	int rm=rmin(rs(x),m+1,r,L,R);
	return min(lm+R-m,rm); 
}void turn(int x,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		lmn[x]=rmn[x]=1e9;
		lb[x]=1;return;
	}push_down(x);int m=(l+r-1)/2;
	if(L<=m) turn(ls(x),l,m,L,R);
	if(R>m) turn(rs(x),m+1,r,L,R);
}int que(int x,int l,int r,int a){
	if(l==r) return lmn[x];
	int m=(l+r-1)/2;
	if(a<=m) return que(ls(x),l,m,a);
	return que(rs(x),m+1,r,a);
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>s;
	build(1,-1e5,1e5);
	add(1,-1e5,1e5,0,0);
	for(int i=1;i<=n;i++){
		int l,r;cin>>l>>r;
		if(l+2>r) continue;
		int lm=lmin(1,-1e5,1e5,l+1,r-1);
		int rm=rmin(1,-1e5,1e5,l+1,r-1);
		turn(1,-1e5,1e5,l+1,r-1);
		add(1,-1e5,1e5,l,lm+1);
		add(1,-1e5,1e5,r,rm+1);
	}int lm=lmin(1,-1e5,1e5,s+1,1e5);
	int rm=rmin(1,-1e5,1e5,-1e5,s-1);
	add(1,-1e5,1e5,s,min(lm,rm)+1);
	cout<<que(1,-1e5,1e5,s);
	return 0;
} 

标签:return,rs,int,题解,min,1e5,训练场,acwing329,dp
From: https://www.cnblogs.com/chang-an-22-lyh/p/18231704/acw329-weilanzhangaixunlianchang_tj

相关文章

  • 会前会后系统Q&A:董事会管理工具相关问题解答
    不同企业在购买董事会管理工具时,都会带有不同的功能需求,希望能够借此提升本企业的董事会管理效率和质量。作为垂直领域的专业SaaS工具,会前会后针对董事会的工作流程研发,符合董事会成员的使用系统,在董事履职、董事会管理中提供颇多助力。下面是关于会前会后系统董事会管理工具......
  • Codeforces Round 949 (Div. 2) 中文题解
    A对于一个特定的\(x\),Piggy总是会选择\(p\)使得\(p\)是质数,所以分数就是\(x\)的质因子个数。容易发现至少有\(t\)个质因子的数是\(2^t\)。最大的满足\(2^t\ler\)的整数\(t\)是\(\left\lfloor\log_2r\right\rfloor\)。又因为\(2l\ler\),所以\(\log_2l+......
  • gpt4free软件的 g4f gui 网页速度非常慢的问题解决
    问题:g4f gui启动网页很难连上gpt4free是一个为大众提供的Openai等大模型API调用服务的软件,但是在装好启动g4f gui,使用8080端口连接后,发现网页一直在执行,半天还没好。怀疑是网页里面的一些js加载有问题。通过在python命令行使用importg4f;g4f.version命令来找到g4f的......
  • MySQL数据库:Lock wait timeout exceeded; try restarting transaction问题解析及解决方
    MySQL数据库:Lockwaittimeoutexceeded;tryrestartingtransaction问题解析及解决方案一、背景描述二、原因分析三、解决方案3.1方案一事务信息查询3.2方案二如果杀掉线程依然不能解决,可以查找执行线程耗时比较久的任务,kill掉3.3方案三innodb_lock_wait_timeout锁定等......
  • (第25天)【leetcode题解】二叉树的层序遍历
    目录429、N叉树的层序遍历题目描述思路代码515、在每个树行中找最大值题目描述思路代码116、填充每个节点的下一个右侧节点指针题目描述思路代码117、填充每个节点的下一个右侧节点指针II题目描述思路代码104、二叉树的最大深度题目描述思路代码111、二叉树的最小深......
  • 2009年408真题解析
    2009年408真题解析【2009.1】为解决计算机主机与打印机之间速度不匹配问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是。A.栈B.队列C.树D.图【知识点】栈和队列特点及应用。【答案】B......
  • P10536 [Opoi 2024] 二十六点 题解
    比较直接的做法。当\(P_x=1\)时显然可以暴力DP,设\(f_{x,c}\)表示\(x\)的子树中以\(c\)开头的最长不下降子序列的长度。直接转移即可。\(P_x\neq1\)的时候呢?我们发现,所谓“忽略掉这些路径中的第\(2\)到第\(P_x\)个的点”,代表的就是按照深度转移,大概就是这样:......
  • CF960G Bandit Blues 题解
    我不会斯特林数。CF960GBanditBlues给你三个正整数\(n\),\(a\),\(b\),定义\(A\)为一个排列中是前缀最大值的数的个数,定义\(B\)为一个排列中是后缀最大值的数的个数,求长度为\(n\)的排列中满足\(A=a\)且\(B=b\)的排列个数。\(n\le10^5\),答案对\(998244353\)取......
  • P10550 [THUPC2024] 贸易 题解
    正式场上拿了这题的首\(A\),让队伍不至于无奖而返。思路容易发现题目的买入卖出过程形似一个括号匹配。那么我们可以对每一种类型的物品做括号匹配。若是一个匹配的括号在询问区间内则可以记入答案。就变成了一个二维数点问题。离线树状树组即可。Code#include<bits/stdc......
  • 关于vue关闭页面时去除定时器失效问题解决
    1.先去除页面缓存,这个在路由部分 2.    ......