尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

一个好题2

一个好题2
📅 发布时间:2026/6/19 7:09:53
一个好题的题解

题目传送门

欢迎光临我的博客

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

相关新闻

  • LucaOne架构
  • 实用指南:Windows安装MongoDB保姆级教程(图文详解)
  • linux USB --- 监听 USB 角色

最新新闻

  • 2026扬州本地人必选防水补漏检测维修公司靠谱服务商TOP5推荐:房屋渗漏水检测维修/卫生间/厨房/天花板/阳台/外墙渗漏水检测补漏维修-暗管漏水检测专业仪器精准定位漏水点 - 即刻修防水
  • 2026株洲各区县黄金回收测评 大盘金价透明无隐形扣费门店 - 润富黄金回收
  • Selenium八大元素定位方法全解析:从原理到实战,解决自动化测试核心难题
  • 2026黄冈最新黄金回收价格参考表及无套路商家推荐 - 润富黄金回收
  • 杭州琳弘湾万金汇金裕恒福满多黄金回收门店实测 - 润富黄金回收
  • 按摩椅双推杆泰式拉筋与普通拉伸效果差异先对照推杆行程与拉伸角度 - 新闻快传

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号