一个好题2

news/2025/11/13 21:04:43/文章来源:https://www.cnblogs.com/qwqSW/p/19219484

题目传送门

欢迎光临我的博客

遇到这种题,我们首先有一个套路:拆贡献。我们把答案拆到每条边上,这样的话只需要加上 每条边在所有合法方案里出现的次数之和 \(\times\) 这条边的长度即可。

那一条边会出现在合法方案里,当且仅当有一个边左侧的城市和一个边右侧的城市建立关系。

我们设 \(f_{i,j}\) 表示当前考虑到了 \(i\) 城市,并且当前有 \(j\) 个城市没有建立关系的方案数。

我们刷表考虑一下 \(f_{i,j}\) 会转移到哪里。当我们加入 \(i+1\) 这个城市时,第一种情况是 \(i+1\) 不和前面的任何城市建立关系,这对应着 \(f_{i,j} \to f_{i+1,j+1}\)。第二种情况是,它和已考虑的一些城市建立了关系,这对应着 \(f_{i,j} \times j \to f_{i+1,j-1}\)

(乘 \(j\) 是因为,当前 \(i+1\) 节点可以选择 \(j\) 个点中任意一个未建立关系的点)

当然,这两种情况都有一个大前提:就是 \(j \le s_i\)。因为这些未配对的城市都要通过这条边出去,去边右边找点配对。

类似地,我们倒着处理 \(g_{i,j}\) 表示考虑了 \([i,n]\) 里的城市时,有 \(j\) 个城市没配对的方案数。

这样的话,我们发现,当我们枚举 \(i\) ~ \(i+1\) 的边时,假设我们在找有 \(j\) 个城市左右配对的情况,那么左边有 \(j\) 个城市没有配对的方案数是 \(f_{i,j}\),右边有 \(j\) 个城市没有配对的方案数就是 \(g_{i,j}\)

而这左右各 \(j\) 个城市之间建立关系时,左边第 \(1\) 个城市有 \(j\) 种选法,第 \(2\) 个城市有 \(j-1\) 种选法,……,第 \(j\) 个城市有 \(1\) 种选法。而当左边城市选完右边城市后,这条路径又会被覆盖 \(j\) 次。

所以这个边总的被覆盖的次数就是 \(f_{i,j} \times g_{i,j} \times j! \times j\),所以这条边的贡献就是 \(f_{i,j} \times g_{i,j} \times j! \times j \times (x_{i+1}-x_{i})\)

累加每条边的贡献即可。

代码:

代码
#include<bits/stdc++.h>
#define int long long
#define _(x,y) ((((x)-(y))%mod+mod)%mod)
#define __(x,y) ((((x)+(y))%mod+mod)%mod)
#define ___(x,y) ((((x)*(y))%mod+mod)%mod)
using namespace std;inline int read(){int x=0,f=1;char c=getchar();while(c<48){if(c=='-') f=-1;c=getchar();}while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}const int N=2025;
const int mod=998244353;
int n,pos[N],s[N],dp[N][N],pd[N][N],fac[N];
//dp[i][j]:当前走到第i个城市,还有j个城市没有配对的方案数 signed main(){n=read();fac[0]=1;//预处理 i! for(int i=1;i<=n;i++) fac[i]=___(fac[i-1],i);for(int i=1;i<=n;i++) pos[i]=read();for(int i=1;i<n;i++) s[i]=read();//初始化,应该是一个点都没有的情况 dp[0][0]=1;for(int i=0;i<n;i++){//它非法却可以由合法状态转移过来,并且能转移到合法状态来,所以要提前清零 for(int j=s[i]+1;j<=n/2;j++) dp[i][j]=0;for(int j=0;j<=s[i];j++){dp[i+1][j+1]=__(dp[i+1][j+1],dp[i][j]);//i+1不匹配城市的情况 if(j) dp[i+1][j-1]=__(dp[i+1][j-1],___(dp[i][j],j));//i+1匹配未匹配城市的情况 }}//初始化,应该是一个点都没有的情况 //转移同上  pd[n+1][0]=1;for(int i=n+1;i>1;i--){//它非法却可以由合法状态转移过来,并且能转移到合法状态来,所以要提前清零 for(int j=s[i-1]+1;j<=n/2;j++) pd[i][j]=0;for(int j=0;j<=s[i-1];j++){pd[i-1][j+1]=__(pd[i-1][j+1],pd[i][j]);//i-1不匹配城市的情况 if(j) pd[i-1][j-1]=__(pd[i-1][j-1],___(pd[i][j],j));//i-1匹配未匹配城市的情况 }}int ans=0;//累加贡献 for(int i=1;i<n;i++)for(int j=0;j<=min(n-i,i);j++)ans=__(ans,___(___(___(dp[i][j],pd[i+1][j]),___(fac[j],j)),pos[i+1]-pos[i]));printf("%lld",ans);return 0;
}

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

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

相关文章

实用指南:百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代

实用指南:百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

考前复习

Floyd 字符串哈希 单调栈/单调队列 三分 ST 表 最小生成树 最近公共祖先(LCA) dij SPFA 缩点 tarjan(割点,割边,点双,边双,判环 ) 线段树,树状数组 欧拉路径 矩阵快速幂 全源最短路(Johnson) 两个排列的最长公…

2025 年 11 月粮库空调厂家最新推荐,聚焦资质、案例、售后的实力品牌深度解析!

在粮食储备行业,粮库空调的性能直接关系到粮食品质与存储安全,随着全球粮食储备技术升级,市场对高精度、高稳定性粮库空调的需求持续增长。本次 2025 年 11 月粮库空调厂家推荐,参考国际制冷协会(IIR)、国际粮食…

题解:P3813 [FJOI2017] 矩阵填数

更差的阅读体验注意到,一个矩阵最大值为 \(x\) 的充要条件是:矩阵中的每一个元素 \(\le x\)。 矩阵中存在至少一个 \(x\)。仅考虑第一个条件是好做的。具体地,每一个格子存在一个取值的上限 \(mx_{i, j}\),也就是所…

第三章博文

1.关于数学三角形这道题目,从图形来看,它拥有自上而下的的逻辑结构,根据观察,可以列出以下的递归方程式: 假设我们使用一个二维数组c的下半三角来存放整个数学三角形,用i来控制行(从1开始),用j来控制列,那么就…

Spring BeanPostProcessor接口

[[Spring IOC 源码学习总笔记]] BeanPostProcessor BeanPostProcessor是 Spring 框架提供的一个扩展点接口,它允许开发者在 Spring 容器完成 Bean 的实例化、依赖注入之后,在初始化阶段的前后“拦截”并自定义 Bean …

25.11.13随笔联考总结

考试 正常通读题面,发现 T1 是构造,T2 很神秘没啥想法,T3 是一个比较明显的 dp,T4 是 ds。思考了一下决定还是顺序开。做 T1,有好几次都给我一种做出来的错觉,但是到最后一直有几个位置不合法,怎么微调都不能构…

完整教程:Verilog和FPGA的自学笔记6——计数器(D触发器同步+异步方案)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

LucaOne架构

https://github1s.com/lucaone/LucaOne/blob/master/src/models/lucaone_gplm.py LucaOne模型架构详解 LucaOne是一个统一的基因-蛋白质多模态基础模型,其架构设计体现了对生物序列本质的深刻理解。模型的核心目标是打…

实用指南:Windows安装MongoDB保姆级教程(图文详解)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

linux USB --- 监听 USB 角色

#include <linux/device.h> #include <linux/module.h> #include <linux/mutex.h> #include <linux/gpio/consumer.h> #include <linux/platform_device.h> #include <linux/usb/typ…

温州工友自动包装设备有限公司:专注螺丝五金智能包装,助力企业降本增效

在温州乐清电器之都,有一家深耕螺丝五金自动化包装设备领域多年的企业 —— 温州工友自动包装设备有限公司。该公司技术研发始于 2007 年,经过多年积累与沉淀,于 2011 年正式注册成立,如今已发展成为集研发生产、销…

25.11.09

CF1935F 如果代价都能做到 1,那就再好不过了。 尝试一下,发现一个子树总有最小值 \(x\),那么连接 \((x,x-1)\) 看起来就做完了。 但是可能 \(x-1\) 被删了,这样就挂了,需要连 \((x,x-2)\)。 然后发现 \((x,x-2)\)…

NOI2025 游记

Day -? UNR。两场应该都认真打了。但是一题不会,打了六个暴力喜提 rk 130 Ag。事后看来这可能掉了 RP。 D2T1 订了一下午。我怎么一点不会数数。 Day -1 报到日。 徽章订了不少,但是我真的太社恐了。跟着 winston 去…

NOIP 考前做题计划

11月14号 复习蓝书上的 \(0x06\) 和 \(0x07\) 节,重新思考 \(0x08\) 内这两节的习题,并为代码写注释 11月15号 上午打洛谷模拟赛,晚上复习蓝书上 \(0x11\) 节,并做当节习题以及 \(0x18\) 节对应的习题 11月16号 复…

网络攻防实战 lab06 靶机 VulnHub hard-socnet2

地址发现 arp-scan -l得到地址为 10.0.2.8。 端口发现与服务版本探测 nmap -p- nmap -p22,80 -sC -sV

[豪の学习笔记] Spring框架学习碎碎念#5

主动获取Bean对象、Bean的作用域、第三方Bean管理跟学视频:黑马JavaWeb课程 Bean管理 获取Bean ​ 默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将b…

Docker部署Code-Server,实现远程写代码

Docker部署Code-Server,实现远你不需要在自己的电脑上安装任何复杂的工具,只需要一个浏览器,就可以开始 C、C++ 和 Python 的学习与开发。参考:使用 Docker 部署 VS Code in The Browser - 谱次 - 博客园 hub.dock…

2025 年 11 月电力金具厂家最新推荐,精准检测与稳定性能深度解析!

全球电力系统对核心部件稳定性的依赖度持续攀升,电力金具的质量与性能直接影响输电网络安全。本次 2025 年 11 月电力金具厂家推荐榜单,由国际电力设备检测协会(IPTA)联合全球三大电力工程机构共同发布,测评覆盖全…

2025 年 11 月铁附件厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读!

随着电力工程、光伏发电及基础设施建设领域的全球化推进,铁附件作为核心配套产品,其品质与供应效率对工程质量的影响愈发显著。为精准筛选优质铁附件厂家,本次推荐结合国际电力设备协会(IEPEA)2025 年第三季度测评…