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

题解:AT_abc214_g [ABC214G] Three Permutations

题意:很简单了,不再赘述。

做法:

直接做很困难,考虑容斥,钦定若干个 \(i=x_i\) 或者 \(i=y_i\),然后如果钦定了 \(k\) 个,那么贡献是 \((n-k)!(-1)^k\)

但是有个问题,我们不能无脑钦定,这些钦定条件间会有一些问题,比如我可能钦定 \(i=k\) 但是同时 \(j=k\),这样就爆炸了。

所以我们考虑对于不能同时钦定的限制去连一条边,手玩一下你会很惊奇地发现这样会形成若干个环,并且这个环上不能取相邻元素!

具体怎么连环呢,对于同一个 \(i\) 间的两个是不能同存的,然后两行同一个数不能被同时钦定。

那么我们就可以对不同长度的环进行 dp,计算出来这个环选 \(x\) 个的有多少种方案,直接枚举第一个选或不选然后跑 dp 即可,复杂度 \(O(n^2)\)

然后最后我们再用一次 dp 对所有的环统计出来钦定了 \(x\) 个限制的方案数,虽然是三重循环但是枚举第 \(x\) 个环再枚举环上选了多少个这两个是 \(O(n)\) 的。

最后乘上贡献即可,复杂度 \(O(n^2)\)

注意一个细节,对于 \(x_i = y_i\) 的情况限制可以同时存在,这种需要特判一下,环上选一个的方案数只有 \(1\) 种。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 6005, mod = 1e9 + 7;
int f[maxn][maxn], t[2][maxn][2], use[maxn], dp[maxn][maxn], len[maxn], tot, jc[maxn];
int x[2][maxn], n;
void solve(int x) {memset(t, 0, sizeof(t));t[0][0][0] = 1;int cur = 0;for (int i = 2; i <= x; i++) {cur ^= 1;for (int j = 0; j <= (i + 1) / 2; j++)t[cur][j][0] = t[cur][j][1] = 0;for (int j = 0; j <= (i + 1) / 2; j++) {t[cur][j][0] = (t[cur ^ 1][j][0] + t[cur ^ 1][j][1]) % mod;t[cur][j][1] = t[cur ^ 1][j - 1][0];} }for (int i = 0; i <= x / 2; i++)f[x][i] = (t[cur][i][0] + t[cur][i][1]) % mod;memset(t, 0, sizeof(t));t[0][1][1] = 1;cur = 0;for (int i = 2; i <= x; i++) {cur ^= 1;for (int j = 0; j <= (i + 1) / 2; j++)t[cur][j][0] = t[cur][j][1] = 0;for (int j = 0; j <= (i + 1) / 2; j++) {t[cur][j][0] = (t[cur ^ 1][j][0] + t[cur ^ 1][j][1]) % mod;t[cur][j][1] = t[cur ^ 1][j - 1][0];} }for (int i = 0; i <= x / 2; i++)f[x][i] = (t[cur][i][0] + f[x][i]) % mod;
}
void solve() {for (int i = 1; i <= tot; i++)use[len[i]] = 1;for (int i = 1; i <= 2 * n; i++)if(use[i])solve(i);f[2][1] = 1;dp[0][0] = 1;int s = 0;for (int i = 1; i <= tot; i++) {s += len[i];for (int j = 0; j <= s / 2; j++)for (int k = 0; k <= min(len[i] / 2, j); k++)dp[i][j] = (dp[i][j] + dp[i - 1][j - k] * f[len[i]][k]) % mod;}int ans = 0;jc[0] = 1;for (int i = 1; i <= n; i++)jc[i] = jc[i - 1] * i % mod;for (int i = 0; i <= n; i++)ans = (ans + dp[tot][i] * jc[n - i] % mod * (i % 2 ? mod - 1 : 1) % mod) % mod;cout << ans << endl;
}
int pos[2][maxn], p[maxn], vis[maxn];
void dfs(int u, int d) {if(vis[u]) {len[tot] = d - vis[u];return ;}vis[u] = d;dfs(p[u], d + 1);
}
signed main() {cin >> n;for (int t = 0; t <= 1; t++) {for (int i = 1; i <= n; i++)cin >> x[t][i], pos[t][x[t][i]] = i;}for (int i = 1; i <= n; i++)p[i] = i + n, p[pos[1][x[0][i]] + n] = i;for (int i = 1; i <= 2 * n; i++)if(!vis[i]) tot++, dfs(i, 1);solve();return 0;
}
http://www.gsyq.cn/news/13443.html

相关文章:

  • 从企业级项目到普惠API:我如何将自研的人脸识别引擎打造成「识度AI」
  • 帮助向量机深度解析:从数学原理到工程实践的完整指南
  • 【Array】类型化数组:强类型集合的优势
  • 【安装红帽子 redhat Linux 9.0版本】教程
  • CentOS 10服务器版 部署Zabbix7.2 server端 - 教程
  • 完整教程:雪山飞狐之 Swift 6.2 并发秘典:@concurrent 的江湖往事
  • 数字孪生背后的通信协议:MQTT、OPC UA选型指南 - 指南
  • 深入解析:DIC技术在极端条件下的应用及解决方案
  • Nginx反向代理配置全流程实战:从环境搭建到HTTPS部署 - 详解
  • crewCTF 2025 -- WASM Vault
  • oppo-r9m线刷刷机教程
  • 【DateTime】日期时间:时间处理的基础
  • 完整教程:蒸汽机革命后工业生产方式的变革与AI智能名片S2B2C商城小程序的影响
  • 2025 PHP7/8 实战入门:15 天精通现代 Web 制作——第 15 课:项目实战与部署
  • 一个问题记录-服务器那边所以得请求进去,去操作数据库的时候,全部都拿不到数据库链接com.alibaba.druid.pool.GetConnectionTimeoutException
  • 稍微人格解离一点也无所谓,别太过就行
  • OI 模板合集
  • 非线性规划、最优控制与多目标优化
  • IDEA/WebStorm 卡顿困难与启动参数调优指南
  • python第三天
  • 全国主要城市温度舒适度榜:谁在天堂,谁在蒸笼
  • 【IEEE出版、曾获中国科协认证】第六届机械工程、智能制造与自动化技术国际学术会议 (MEMAT 2025)
  • 【2025-09-26】奋斗逻辑
  • Elasticsearch 7.15索引模板介绍 - 实践
  • python的批量赋值语法
  • 图领域的METIS算法介绍 - zhang
  • 【Double】浮点数:精确的小数计算
  • CANOpen safety SRDO相关问题总结
  • 完整教程:【有源码】基于Hadoop+Spark的AI就业影响数据分析与可视化系统-AI驱动下的就业市场变迁数据分析与可视化研究-基于大数据的AI就业趋势分析可视化平台
  • 牛客刷题-Day6