首页 > 其他分享 >CF1677D Tokitsukaze and Permutations

CF1677D Tokitsukaze and Permutations

时间:2023-09-20 17:33:36浏览次数:31  
标签:return int Permutations ++ CF1677D Tokitsukaze 1ll ans mod

好玩题。

对于一个排列 \(p\),进行 \(k\) 轮冒泡,记 \(v_i = \sum_{j < i} [p_j < p_i]\),给定 \(v_i\),部分值不确定,求合法的 \(p\) 的个数。

  1. \(p\) 由 \(v\) 唯一确定。

考虑一个个加数字进去,每次可以判断加入数字与前面数字的相对大小,于是可以确定原排列。

只用研究 \(v\),不用研究 \(p\)。

  1. 一轮冒泡形如:整体前移 \(1\) 位,减一,对 \(0\) 取 \(\max\)。

相邻两项会交换等价于后一项的 \(v\) 不为 \(0\),否则一定交换,对应 \(v\) 减一。

于是最后的 \(v\) 是原来的 \(v\) 左移 \(k\) 位,减 \(k\),对 \(0\) 取 \(\max\)。

  1. 不合法的情况只有:最后 \(k\) 项不为 \(0\),\(v_i \geq i\)。

其余情况一定合法。

为 \(-1\) 时,有 \(i\) 种互不干涉的选择;为 \(0\) 时,有 \(\min\{i, k+1\}\) 种选择;否则选择唯一。

题目不难,记录下来只是想反思:为什么自己没有想到?

我想到了直接去看 \(v\) 的特征,发现了前移的特征,但是因为多个 \(v\) 会得到一个结果,没有继续往后想。

很应该想到的是,研究 \(p\),最后仍然要转到 \(v\) 上,因此不如研究 \(v\);至于后面的发现,均较为自然。

没脑子了,what should I do?

#include <bits/stdc++.h>

const int mod = 998244353;

int solve() {
  int n, k, ans = 1; scanf("%d %d", &n, &k);
  std::vector<int> a(n);
  for (auto &v : a) scanf("%d", &v);
  for (int i = n - k; i < n; i++) if (a[i] && a[i] != -1) return 0;
  for (int i = 0; i < n; i++) if (a[i] > i) return 0;
  for (int i = 0; i < k; i++) ans = 1ll * ans * (i + 1) % mod;
  for (int i = 0; i < n - k; i++) {
    if (a[i] == -1) ans = 1ll * ans * (i + k + 1) % mod;
    else if (a[i] == 0) ans = 1ll * ans * (k + 1) % mod;
  }
  return ans;
}

int main() {
  int t; scanf("%d", &t); while (t--) {
    printf("%d\n", solve());
  }
}

标签:return,int,Permutations,++,CF1677D,Tokitsukaze,1ll,ans,mod
From: https://www.cnblogs.com/purplevine/p/17717878.html

相关文章

  • 【刷题笔记】46. Permutations
    题目Givenacollectionof distinct integers,returnallpossiblepermutations.Example:Input:[1,2,3]Output:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]题目大意给定一个没有重复数字的序列,返回其所有可能的全排列。解题思路求出一......
  • SP8591 PRIMPERM - Prime Permutations 题解
    题目链接题目大意给出\(1\)个数\(n\),求\(n\)的各位拆分后重新排列组合得到新数是质数的个数。思路(欧拉筛,全排列)对于求质数,与其每组数据运行\(1\)次质数筛,不如在一开始就筛出\([1,10^7]\)内的所有质数,用bool数组统计起来,这样只需运行\(1\)次质数筛,大大节约了时间......
  • Permutations 题解
    题目传送门一道枚举题。数据范围非常小,考虑暴力枚举全排列。可以dfs两次,第一次求出能使\(f(p)\)取得的最大值。第二次求出第\(m\)个排列。注意一下,第二次dfs的时候需要按字典序枚举。Code#include<bits/stdc++.h>#definelllonglong#defineINF1e9usingname......
  • CF1175F The Number of Subpermutations 对自己的警告--zhengjun
    太久没见过启发式合并了,然后没想出做法。首先笛卡尔树建出来。然后直接枚举跨过\(mid\)的长度为\(a_{mid}\)的区间,RMQ\(O(1)\)验证即可。发现这样的区间个数不超过左右区间大小的较小值,时间复杂度:\(O(n\logn)\)。代码#include<bits/stdc++.h>usingnamespacestd;us......
  • AtCoder Beginner Contest 214 G Three Permutations
    洛谷传送门AtCoder传送门比较平凡的一个容斥。考虑把问题转化成,求\(\foralli\in[1,n],r_i\nei\landr_i\nep_i\)的\(r\)方案数。考虑到不弱于错排,所以容斥。设钦定\(i\)个\(r_i\)取了\(i,p_i\)中的一个的方案数为\(f_i\),其余任意,那么:\[ans=\sum\limi......
  • SP15637 Mr Youngs Picture Permutations 题解
    题意给定一个最多有\(5\)排的一个队伍,每一个位置对应一个同学,给定总人数和第\(i\)排要站\(n_i\)个人。要求每行左边的同学身高要大于右边的,每列从上往下要从大到小。问:满足要求的一共有多少种方案。思路DP首先考虑,在这个题目中,有用的状态有每列最后的人的高度,每行......
  • Atcoder Regular Contest 118 E - Avoid Permutations(容斥+DP)
    挺套路的DP。第一步是显然的:转换贡献体,DP一条从\((0,0)\)到\((n+1,n+1)\)的路径,然后计算有多少个排列满足这条路径不经过任何一个\((i,p_i)\)。正着统计肯定不好求,考虑容斥。即我们钦定一些路径上的点,满足这些点必须对应某个\((i,p_i)\),然后计算有多少个\(p\)符合这个......
  • D. XOR Permutations
    D.XORPermutations注意多次输入输出不要忘了初始化注意分析代码点击查看代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#inc......
  • CF888D Almost Identity Permutations 题解
    CF链接:AlmostIdentityPermutationsLuogu链接:AlmostIdentityPermutations${\scr\color{Aquamarine}{\text{Solution}}}$前言这好像是一道能用数学秒掉的题目但......
  • 线段树维护哈希 | CF213E Two Permutations + CF452F Permutation
    __终于学到了线段树维护xx,嘿嘿,嘿嘿嘿..树树:D做了两题,感觉知识点是维护区间相同不相同可以拿hash做,不连续的区间也可以拿hash维护主要是出得很有想法,太妙了要想得到hh1.......