「UER#2」信息的交换

吉利题..

不难发现,置换中的每一个循环是独立的,每一个循环分别对应一个独立的联通块。

根据题目的性质,每一个联通块做的事情等价于其按照编号从小到大遍历的的dfs生成树做的事情,那么只需要考虑一棵dfs生成树做的事情即可。

对于一棵dfs生成树,将每个点的儿子按照编号从小到大排序,考虑节点 \(u\) 以及它的儿子 \(v_1,v_2..v_k\) ,其中 \(v_k\) 的权值最终会到 \(u\) 的位置上,\(\forall i<k,v_i\) 的值会先到 \(v_{i+1}\) 的位置上去,到访问到 \(v_i+1\) 的时候在继续做同样的事情,最终会到达 \(v_{i+1}\) 这棵子树最左边的叶子上。定义逆dfs序为先遍历编号大的儿子的dfs序,这个过程做完相当于节点 \(v\) 到了逆dfs序的前一位对应的节点上,根节点到逆dfs序上最后一位对应的节点。相当于按照逆dfs序做了一个置换!

那么只需要将每个循环对应的逆dfs序求出来,再计算有多少棵树的逆dfs序符合。对于一棵符合的树,其连上一些返祖边可以得到符合的图,大力DP一下即可,复杂度 \(\mathcal O(n^3)\) 。

code

/*program by mangoyang*/
#include <bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 505, mod = 998244353;
int vis[N], pw[N], a[N], f[N][N], h[N][N], c[N][N], n;
inline void up(int &x, int y){ x = x + y >= mod ? x + y - mod : x + y; }
inline int gao(vector<int> &A){
if(!(int) A.size()) return 1;
int m = A.size();
for(int i = 0; i < m; i++)
for(int j = i + 1; j < m; j++)
c[i][j] = c[i][j-1] + (A[j] > A[i]);
for(int i = 0; i < m; i++)
for(int j = 0; j < m; j++) f[i][j] = 0;
for(int i = 0; i < m; i++) f[i][i] = h[i][i] = 1;
for(int i = m - 1; ~i; i--)
for(int j = i + 1; j < m; j++){
f[i][j] = h[i][j] = 1ll * f[i+1][j] * pw[c[i][j]] % mod;
for(int k = i; k < j; k++) if(A[i] > A[k+1])
up(f[i][j], 1ll * h[i][k] * f[k+1][j] % mod);
}
return f[0][m-1];
}
int main(){
read(n), pw[0] = 1;
for(int i = 1; i <= n; i++) read(a[i]);
for(int i = 1; i <= n; i++) pw[i] = 2ll * pw[i-1] % mod;
int ans = 1;
for(int i = 1; i <= n; i++) if(!vis[i]){
vector<int> A;
vis[i] = 1;
for(int p = a[i]; p != i; p = a[p])
A.push_back(p), vis[p] = 1;
ans = 1ll * ans * gao(A) % mod;
}
cout << ans << endl;
}

「UER#2」信息的交换的更多相关文章

  1. 「UER#2」谣言的传播

    「UER#2」谣言的传播 写了个乱搞,怎么莫名其妙就AC了,这...,之后又想了30min结合题解终于会证了. 首先最大值比较简单,记 \(f_i\) 为第 \(i\) 个点能到达的点数,上界 \(\ ...

  2. Diary / Solution Set -「WC 2022」线上冬眠做噩梦

      大概只有比较有意思又不过分超出能力范围的题叭.   可是兔子的"能力范围" \(=\varnothing\) qwq. 「CF 1267G」Game Relics   任意一个 ...

  3. 图解最长回文子串「Manacher 算法」,基础思路感性上的解析

    问题描述: 给你一个字符串 s,找到 s 中最长的回文子串. 链接:https://leetcode-cn.com/problems/longest-palindromic-substring 「Ma ...

  4. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  5. 「POJ 3666」Making the Grade 题解(两种做法)

    0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...

  6. 「C语言」文件的概念与简单数据流的读写函数

    写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入.输出. 其实, ...

  7. 「C语言」Windows+EclipseCDT下的C语言开发环境准备

    之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...

  8. 日均百万 PV 的站点如何做性能监测?试试「3M口罩」!

    对很多开发者而言,如果网站的日流量达到百万级别,峰值 PV 也突破了 3 万,这样的站点在线下测试的时候总是让人心力交瘁.... 生产环境下的性能监测问题更是尤其让人头疼! 开发同学在想,运维人员也在 ...

  9. 微服务架构之「 API网关 」

    在微服务架构的系列文章中,前面已经通过文章<架构设计之「服务注册 」>介绍过了服务注册的原理和应用,今天这篇文章我们来聊一聊「 API网关 」. 「 API网关 」是任何微服务架构的重要组 ...

随机推荐

  1. 【LG3582】[POI2015]KIN

    [LG3582][POI2015]KIN 题面 洛谷 题解 这题维护区间的信息有点像最大子段和,我们往最大子段和上面靠. 对于一个颜色,我们有一个直观的想法就是将它一次出现的权值设为正,二次出现就设为 ...

  2. JVM和ClassLoader

    JVM和ClassLoader 2019-11-08 目录 1 JVM架构整体架构 1.1 类加载器子系统 1.1.1 加载 1.1.2 链接 1.1.3 初始化 1.2 运行时数据区(Runtime ...

  3. Tecplot——为动画添加求解时间(翻译)

    翻译自:<Tecplot 360 Getting Started Manual>中的Scenic Detour: Add Solution Time Caption 首先展示效果: 在画图 ...

  4. C++的static_cast、dynamic_cast和const_cast用法

    static_cast.dynamic_cast和const_cast static_cast: ​ 用法: static_cast < type-id > (expression) ​ ...

  5. win10安装ubuntu双系统遇到的问题

    安装过程学习了几个博客 Ubuntu 16.04与Win10双系统双硬盘安装图解:https://www.cnblogs.com/coxiseed/p/9945202.html?tdsourcetag ...

  6. supervisor更改某项目配置后 需要重新启动才有效

    在linux服务器上部署了node项目,使用supervisor进行管理,supervisor是个好工具,具体介绍见这里about supervisor 梗概了该项目对的某些配置后,重新启动项目,发现 ...

  7. Tensorflow 损失函数(loss function)及自定义损失函数(三)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/limiyudianzi/article ...

  8. poi导出word表格跨行

    DataCommon.java package com.ksource.pwlp.model.statistic; public class DataCommon { private Long id; ...

  9. Logstash配置以服务方式运行

    Logstash官网最新版下载地址以及YUM源:https://www.elastic.co/cn/downloads/logstash Logstash最常见的运行方式即命令行运行 ./bin/lo ...

  10. Python3用多线程替代for循环提升程序运行速度

    [本文出自天外归云的博客园] 优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from thre ...