洛谷P8502题解

[problem] \color{blue}{\texttt{[problem]}} [problem]

在这里插入图片描述

[Solution] \color{blue}{\texttt{[Solution]}} [Solution]

这题最恶心的地方是卡空间

我们先考虑不卡空间时怎么做。

直接并不好做,我们考虑正难则反,即利用容斥原理。答案应为从 a a a 没有任何限制经过 m m m 条边到 b b b 的方案数减去从 a a a 经过 m m m 条边到 b b b 且必须经过 c c c 的方案数。

自然地,我们会想到用 f m , i , j f_{m,i,j} fm,i,j 表示从 i i i 经过 m m m j j j 的方案数。显然其初始条件 f 0 , i , i = 1 f_{0,i,i}=1 f0,i,i=1

不难得到, f f f 的转移方程为:

f m , i , j = ∑ k → j f m − 1 , i , k f_{m,i,j}=\sum\limits_{k \to j}f_{m-1,i,k} fm,i,j=kjfm1,i,k

其中 k → j k \to j kj 表示节点 k k k 可以到达节点 j j j

很显然,由于每个节点可以到达的节点是一段连续的区间,我们可以用差分来优化我们的 dp \text{dp} dp

表面上看,最终答案似乎就是

f m , a , b − ∑ k = 0 m ( f k , a , c × f m − k , c , b ) f_{m,a,b}-\sum\limits_{k=0}^{m} \left (f_{k,a,c} \times f_{m-k,c,b} \right ) fm,a,bk=0m(fk,a,c×fmk,c,b)

但是,这样的计数是错误的。因为我们可以多次经过 c c c 这个节点,而每一次经过节点 c c c 都会被重复计数。比如在一条途径中,我们在 3 , 7 , 9 3,7,9 3,7,9 次经过节点 c c c,那么我们在 k = 3 , 7 , 9 k=3,7,9 k=3,7,9 时都会把这条途径计入。

怎样避免重复?我们可以强制从 c c c b b b 的路径不能再经过 c c c。那这样会不会导致计数遗漏?不会,因为从 a a a c c c 的路径还是可以重复经过 c c c 的。

于是,我们可以新开一个数组 g m , i , j g_{m,i,j} gm,i,j 表示从 i i i 经过 m m m 条边到 j j j 但不能经过 i i i 的方案数。 g g g 的转移和 f f f 相似,只是 g l , i , i = 0 ( l = 1 , 2 , … , m ) g_{l,i,i}=0(l=1,2,\dots,m) gl,i,i=0(l=1,2,,m)

但是这题卡空间。

我们发现, f f f g g g m m m 时的转移都只和 ( m − 1 ) (m-1) (m1) 有关。于是 f f f g g g 完全可以重复利用,只需要开二维即可。这样是可以满足空间要求的。但是有个问题,就是我们不能随时询问随时回答,因为我们并没有保留任意的 m m m 的状态信息。

怎么办?不能在线回答询问,那就离线!于是主体思路完成。

离线这一点,这题的难度上了一个台阶。

Code \color{blue}{\text{Code}} Code

const int mod=998244353;
inline void add(int &a,int b){
	a=(a+b>mod?a+b-mod:a+b);
}

const int N=510,M=105;
int l[N],r[N],n,q,m;
int f[2][N][N],g[2][N][N];

struct Query{
	int a,b,c,m,ans,f[M],g[M];
}Q[100010];

int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&l[i],&r[i]);
	for(int i=1;i<=q;i++){
		scanf("%d%d",&Q[i].a,&Q[i].b);
		scanf("%d%d",&Q[i].c,&Q[i].m);
		m=max(m,Q[i].m);
	}
	
	for(int i=1;i<=n;i++)
		f[0][i][i]=g[0][i][i]=1;//init
	
	for(int k=0;k<=m;k++){
		bool s=(k&1),t=(s^1);//s 表示这一维的信息,t 表示下一维
		
		for(int i=1;i<=q;i++){
			int a=Q[i].a,b=Q[i].b,c=Q[i].c;
			Q[i].f[k]=f[s][a][c];Q[i].g[k]=g[s][c][b];
			if (k==Q[i].m) Q[i].ans=f[s][a][b];
		}
		
		memset(f[t],0,sizeof(f[t]));
		memset(g[t],0,sizeof(g[t]));
		
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if (r[j]){//可转移 
					add(f[t][i][l[j]],f[s][i][j]);
					add(f[t][i][r[j]+1],mod-f[s][i][j]);
					add(g[t][i][l[j]],g[s][i][j]);
					add(g[t][i][r[j]+1],mod-g[s][i][j]);
				}
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				add(f[t][i][j],f[t][i][j-1]);
				add(g[t][i][j],g[t][i][j-1]);
			}
			g[t][i][i]=0;
		}
	}
	
	for(int i=1;i<=q;i++)
		for(int j=0;j<=Q[i].m;j++)
			Q[i].ans=(Q[i].ans-1ll*Q[i].f[j]*Q[i].g[Q[i].m-j]%mod)%mod;
	
	for(int i=1;i<=q;i++){
		Q[i].ans=(Q[i].ans+mod)%mod;
		printf("%d\n",Q[i].ans);
	}
	
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL如何定义缓冲区管理器?

目录 一、PostgreSQL是什么二、缓冲区管理器介绍三、缓冲区管理器的应用场景四、如何定义缓冲区管理器 一、PostgreSQL是什么 PostgreSQL是一种高级的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它以其稳定性、可靠性和高度可扩展性而闻名。它最初由加…

职升网:注安工程师适合用什么样的答题方法?

一、熟悉题型与答题方法&#xff1a; 不同科目和题型有不同的答题技巧。例如&#xff0c;选择题可采用排除法、关键词推理法及对比分析法等方式答题&#xff1b;案例分析题则需要全面考虑&#xff0c;逐条举例。 二、合理规划时间&#xff1a; 在考试时&#xff0c;要合理规…

ICP、ISP及IAP烧录介绍

文章目录 不同的程序下载方式一、ICP:In-Circuit Programming二、ISP:In-System Programming三、IAP:In-Application ProgrammingIAP方案设计不同的程序下载方式 目前,单片机的程序烧录方式可以分为三种:ICP、ISP、IAP。 ICP:In Circuit Programing,在电路编程; ISP:…

【辨析】快速了解RBF神经网络与BP神经网络的区别

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、RBF与BP模型简介1.1.模型结构1.2.模型表达式 二、RBF神经网络与BP神经网络的对比2.1 RBF与BP的激活函数对比2.2 RBF与BP的思想对比 三、RBF神经网络与BP神经网络的训练方法对比2.1.BP神经网络的训练2.2.RBF神…

ultralytics官方更新 | 添加YOLOv10到ultralytics

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、…

MyBatis拦截器(Interceptor)的理解与实践

文章目录 1. 什么是MyBatis拦截器&#xff1f;2. 拦截器的基本原理3. 编写自定义拦截器3.1 示例&#xff1a;实现SQL执行时间统计拦截器3.2 配置拦截器 4. 实战应用场景5. 总结 &#x1f389;欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博…

springboot学习01-[springboot介绍、配置文件介绍、自动配置读取原理]

springboot介绍、配置文件介绍、自动配置读取原理 springBoot学习代码说明为什么java -jar springJar包后项目就可以启动 配置文件介绍配置文件加载顺序其他约定配置文件加载顺序profile配置文件加载配置文件绑定类属性通过Value的方式进行属性注入通过ConfigurationProperties…

python爬虫学习笔记一(基本概念urllib基础)

学习资料&#xff1a;尚硅谷_爬虫 学习环境: pycharm 一.爬虫基本概念 爬虫定义 > 解释1&#xff1a;通过程序&#xff0c;根据URL进行爬取网页&#xff0c;获取有用信息 > 解释2&#xff1a;使用程序模拟浏览器&#xff0c;向服务器发送请求&#xff0c;获取相应信息…

如何设置Excel单元格下拉列表

如何设置Excel单元格下拉列表 在Excel中设置单元格下拉列表可以提高数据输入的准确性和效率。以下是创建下拉列表的步骤&#xff1a; 使用数据验证设置下拉列表&#xff1a; 1. 选择单元格&#xff1a; 选择你想要设置下拉列表的单元格或单元格区域。 2. 打开数据验证&…

Emacs之实现目录替换(一百四十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题是由安全生产模拟考试一点通提供&#xff0c;P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材&#xff0c;P气瓶充装大纲整理而成&#xff08;含2024年P气瓶…

yolov8训练初体验

最近在爬一些数据&#xff0c;有些网址的验证码比较难搞&#xff0c;于是使用yolov8来解决。 一、数据打标签并转为txt 使用的软件为X-AnyLabeling。内置各种模型&#xff0c;方便打标。 打标完成后由于是json格式&#xff0c;所以我们使用python转换即可 import json import…

2024各省自考报名时间汇总❗所需材料❗

天津&#xff1a;5月27日-5月31日&#xff08;已结束&#xff09; 河北&#xff1a;6月10日~6月15日&#xff08;已结束&#xff09; 贵州&#xff1a;6月17日~26日 山东&#xff1a;6月18日~6月24日 江西&#xff1a;6月26日-7月7日&#xff08;6月下旬&#xff09; 浙江&…

【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx

【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载&#xff1a; https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括…

详解互联网基石之HTTPS

一、HTTPS简介 HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种用于安全通信的网络传输协议。它是HTTP的加密版本&#xff0c;通过使用TLS&#xff08;Transport Layer Security&#xff09;或其前身SSL&#xff08;Secure Sockets Layer&#xff09;来…

我不太建议大家早睡!

自从我早晨5点开始睡&#xff0c;这身体是越来越差了...... 开个玩笑&#xff5e;&#xff5e; 大家好&#xff0c;我是前端队长&#xff0c; 自从上次科学减脂挑战完毕&#xff0c;我一个月瘦了6.4斤&#xff0c;我还是挺满意的&#xff0c; 唯一不开心的是&#xff0c;我这样…

vscode配置vue格式化代码不管用

所有配置都配好了就是无法使用自己想要的vetur格式化代码 后台发现调整默认格式化代码的顺序就可以&#xff0c; 修改该后就可以了

[面试题]MongoDB

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

AI时代的音乐革命:创作更简单,灵魂在哪里?

#AI在创造还是毁掉音乐# 我是李涛&#xff0c;一名音乐创作者&#xff0c;最近一直在思考一个问题&#xff1a;AI到底是在创造音乐&#xff0c;还是在毁掉音乐&#xff1f; 几个月前&#xff0c;我第一次接触到AI音乐创作工具。它让我震惊&#xff0c;只需要输入几个关键词&a…

【Android面试八股文】自定义View执行invalidate()方法为什么有时候不会回调onDraw()?

文章目录 一、自定义View执行invalidate()方法为什么有时候不会回调onDraw()?1.1 invalidate 软件绘制流程1.2 invalidate源码分析1.2.1 skipInvalidate()方法1.2.2 invalidateChild方法1.2.2.1 硬件加速绘制1.2.2.2 软件刷新1.2.3 小结一、自定义View执行invalidate()方法为什…