当前位置: 首页 > news >正文

一个好题2

题目传送门

欢迎光临我的博客

遇到这种题,我们首先有一个套路:拆贡献。我们把答案拆到每条边上,这样的话只需要加上 每条边在所有合法方案里出现的次数之和 \(\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.jsqmd.com/news/39675/

相关文章:

  • 实用指南:百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代
  • 考前复习
  • 2025 年 11 月粮库空调厂家最新推荐,聚焦资质、案例、售后的实力品牌深度解析!
  • 题解:P3813 [FJOI2017] 矩阵填数
  • 第三章博文
  • Spring BeanPostProcessor接口
  • 25.11.13随笔联考总结
  • 完整教程:Verilog和FPGA的自学笔记6——计数器(D触发器同步+异步方案)
  • LucaOne架构
  • 实用指南:Windows安装MongoDB保姆级教程(图文详解)
  • linux USB --- 监听 USB 角色
  • 温州工友自动包装设备有限公司:专注螺丝五金智能包装,助力企业降本增效
  • 25.11.09
  • NOI2025 游记
  • NOIP 考前做题计划
  • 网络攻防实战 lab06 靶机 VulnHub hard-socnet2
  • [豪の学习笔记] Spring框架学习碎碎念#5
  • Docker部署Code-Server,实现远程写代码
  • 2025 年 11 月电力金具厂家最新推荐,精准检测与稳定性能深度解析!
  • 2025 年 11 月铁附件厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读!
  • LucaOne模型的词汇表系统
  • v4l2用户侧使用流程
  • 2025 年终端数据安全软件公司推荐数篷科技(深圳)有限公司,数据安全领域的坚实力量
  • Day37(7)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project01\springboot-web-01
  • 网络协议工程 - eNSP及相关软件安装 - [eNSP, VirtualBox, WinPcap, Wireshark, Win7] - 教程
  • 20232314 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 20232314 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 深度学习实验一之图像特征提取和深度学习训练数据标注 - 实践
  • 题解:ABC232G Modulo Shortest Path
  • 如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程,附安装包)