首页 > 其他分享 >CF1909F1 Small Permutation Problem (Easy Version) 题解

CF1909F1 Small Permutation Problem (Easy Version) 题解

时间:2024-11-15 21:57:57浏览次数:1  
标签:int 题解 CF1909F1 Version Easy define

CF1909F1 Small Permutation Problem (Easy Version) 题解

直接莽做显然不好统计。考虑统计每一次 \(i\) 的变化有多少种方案数来匹配,也就是对 \(a\) 数组差分。

考虑到对于 \(a_i\),只有 \([1,i]\) 里的数会对 \(a_i\) 有影响。注意到 \(p\) 形成一个排列,于是我们不妨考虑此时 \(p\) 中 \([1,i]\) 的贡献。

我们记 \(d=a_i-a_{i-1}\)。

  • 若 \(d=0\),\(p_i>i\)。此时 \([1,i]\) 中不变化,答案不变。
  • 若 \(d=1\),可能是 \(i\) 这个数填在 \(1\sim i-1\) 中未填的位置上或 \([1,i]\) 中有数字填在位置 \(i\) 上。未填的位置有 \(i-1-a_{i-1}\) 个,剩余的数字还有 \(i-a_{i-1}\) 个,二者相加就是方案数系数。
  • 若 \(d=2\),一定是 \(i\) 填在 \(1\sim i-1\) 未填的位置上或 \([1,i-1]\) 中有数字填在位置 \(i\) 上。于是方案数的系数就是 \((i-a_{i-1}-1)^2\)。
  • 若 \(d>2\),显然无解,输出 -1 即可。

注意加上一些不合法情况的特判即可。

代码:

#include <bits/stdc++.h>
#define N 200005
#define mod 998244353
#define int long long
using namespace std;
int T;
int n;
int a[N];
int solve() {
	if (a[1] > 1 || a[n] != n) return 0;
	int ans = 1;
	for (int i = 1; i <= n; i++) {
		int p = a[i] - a[i - 1];
		if (p == 0) continue;
		else if(p == 1) ans = ans * (i - a[i - 1] + i - 1 - a[i - 1]) % mod;
		else if(p == 2) ans = ans * (i - 1 - a[i - 1]) % mod * (i - 1 - a[i - 1]) % mod;
		else return 0;
	}
	return ans;
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> T;
	while (T--) {
		cin >> n;
		for (int i = 1; i <= n; i++)
			cin >> a[i];
		cout << solve() << "\n";
	}
	return 0;
}

标签:int,题解,CF1909F1,Version,Easy,define
From: https://www.cnblogs.com/Rock-N-Roll/p/18548733

相关文章

  • [题解]P5687 [CSP-S2019 江西] 网格图
    P5687[CSP-S2019江西]网格图简单来说题目就是给定一个\(n\timesm\)的网格图,同行边权相同,同列边权相同,求该网格图的最小生成树。根据Kruskal算法的贪心思想,我们要优先选择权值尽可能小的行,并将这条边应用于尽可能多的列。列方向同理。为了保证最终生成树的连通性,我们显然要......
  • 题解: BZOJ3517 翻硬币
    ProblemLinkBZOJ3517翻硬币题目描述有一个\(n\)行\(n\)列的棋盘,每个格子上都有一个硬币,且\(n\)为偶数。每个硬币要么是正面朝上,要么是反面朝上。每次操作你可以选定一个格子\((x,y)\),然后将第\(x\)行和第\(y\)列的所有硬币都翻面。求将所有硬币都变成同一个面最少......
  • ISCTF比赛PWN题前三题题解
    萌新第一次发布题解,如有错误还请各位大佬指出。本次比赛个人pwn出题情况,还是太菜了,后面四题基本看不懂girlfriend解题思路:利用填充覆盖检查位置,绕过前面admin检查,进入vuln函数,经过动调发现,每次数据存放位置,从而达到提权解题过程存在后门函数read可以读取0x30大小,观察buf......
  • P9870 [NOIP2023] 双序列拓展 题解
    P9870[NOIP2023]双序列拓展题解NOIP2023T3,特殊性质题。什么是特殊性质题?就是题目给出了你极其神秘的性质,从而引导你想出正解。本篇题解将从部分分的角度,一步步讲述部分分与正解的关系。这样看的话,本题会变得十分简单。\(\text{Task}1∼7,O(Tnm)\)简化题意其实就是要求......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解总结
    AtCoderBeginnerContest379Rated:\(770\)A-Cyclic简单模拟。B-Strawberries字符串模拟,substr函数秒了C-Repeating中等模拟。思路:判断是否合法很简单,重点在计算花费。假设我们是\(0\)号点有\(N\)个棋子,然后移动到每个点上,显然花费为\(\frac{N(N+1)}{......
  • [CEOI2023] The Ties That Guide Us 题解
    Description你用销售机器人的利润雇佣了一名助手,现在你准备好去拿走装有CEOI奖章的保险箱了。保险箱位于一所由\(n\)个房间所组成的大学建筑内,这些房间由\(n-1\)扇门连接。每个房间都可以从其他任何房间到达,且每个房间最多与\(3\)扇门相连。你和你的助手都有描述建筑物......
  • P1437 敲砖块 题解
    题意在一个凹槽中放置了\(n\)层砖块、最上面的一层有\(n\)块砖,从上到下每层依次减少一块砖。每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示:14154323333376221311222331如果你想敲掉第\(i\)层的第\(j\)块砖的话,若\(i=1\),你可以直接......
  • 未能加载文件或程序集 “项目名称对应的程序集,Version=1.0.0.0.culture=neutral.Publi
    VisualStudio2022,AutoCAD开发,wpf项目,因viewmodel中代码出现问题,造成窗体设计器中无法预览(这个问题通过修改viewmodel代码解决), 删除项目路径下的obj及bin文件夹后,重新生成项目,出现新的错误:窗体能够显示了,但个别控件无法正常显示,以为是visualstudio出了问题,修复、......
  • [CEOI2023] Tricks of the Trade 题解
    Description有\(n\)个机器人排成一排,第\(i\)个机器人的购买价是\(a_i\)欧元,卖出价是\(b_i\)欧元。给定\(1\lek\len\),你需要购买一段长度至少为\(k\)的区间中所有的机器人,然后选择其中的恰好\(k\)个机器人来卖出。你需要求出:你能够得到的最大收益;在收益最大化......
  • P11276 第一首歌 题解
    P11276第一首歌题解一道简单的字符串题目。题目解释说求一个最短的字符串\(t\),使其满足对于给定的字符串\(s\):\(s\)为\(t\)的前缀。\(s\)为\(t\)的后缀。\(s\)不为\(t\)。仔细思考一下,则易得\(t\)的最短长度的最大值为\(s\)的两倍。即当\(s\)......