【P5999】求排列 p 的数量,满足 pi 两边的数同时小于或大于 pi,且 p1=S, pN=T。
f(n,m):前 n 小的值分成 m 段的方案数。
从小到大加入每一个数,考虑现在枚举到 n,若 n=S 且 n=T,则可以分三种情况讨论:
- 新开一段
- 若 n=S 且 n=T,以后 n 两侧的都比它大,与题意相符,转移 f(n,m)←(m−[n>S]−[n>T])f(n−1,m−1)。
- 若 n=S 或 n=T,与题意相符,转移 f(n,m)←f(n−1,m−1)。
- 接在某一段头 / 尾
- 若 n=S 且 n=T,以后一定有一个 >n 的数接在 n 另一侧,n 两侧就有一个大于的和一个小于的,与题意不符。
- 若 n=S 或 n=T,与题意相符,转移 f(n,m)←f(n−1,m)。
- 将两段连起来
- 若 n=S 且 n=T,此时 n 两侧的都比它小,与题意相符,转移 f(n,m)←mf(n−1,m+1)。
- 若 n=S 或 n=T,与题意不符。
答案为 f(N,1)。
文章作者: 小明同學
版權聲明: 本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 小明の雜貨屋!
相關推薦
2025-04-01
【组合计数杂谈】三道 Bingo 游戏题(备份)
本文涉及的知识点:组合数公式,古典概型,Min-Max 反演及推广,卷积优化思想,状态压缩思想与状态压缩 DP,快速数论变换 NTT,快速数论变换 NTT,快速沃尔什变换 FWT。 本系列教程「以题带讲」,以典型题目为载体,着重讲解知识点的适用条件和使用方法,而规避复杂的理论推导。 我不擅长数学,对 CF 和区域赛的数学题,从简单计算到数论组合都望而却步。「tag 是数学吗那不做了。」 可能是因为网上的教程大多是罗列定理,给出大段证明,最后放几个例题链接。我没有耐心和能力读完整篇文章。 2024 ICPC World Finals Astana B. Bingo for the Win! Bingo 游戏,nnn 个人每人要抢 kkk 个数,主持人按随机顺序依次报数,报到每个数 [1,109][1,10^{9}][1,109] 的概率相同。已知如果有多名选手要抢某个数字,那么编号小的选手总是优先抢到。问每个人成为最后一名(其他人都抢完了但自己还没抢完)的概率。 ...

2025-01-11
Good Bye 2024: 2025 is NEAR A - E
无向图有边权。有 qqq 个形式为 (a,b,k)(a, b, k)(a,b,k) 的查询:从顶点 aaa 到顶点 bbb 的所有路径中,找出路径 上第 kkk 大边权的最小值。n⩽400, q⩽3×105n \leqslant 400,\ q \leqslant 3 \times 10^{5}n⩽400, q⩽3×105。 枚举答案 www,把边权 ⩽w\leqslant w⩽w 的变成 0,>w> w>w 的变成 1。如果 da→b<kd_{a\to b}<kda→b<k,就说明答案 ⩽w\leqslant w⩽w。
2026-05-30
01 串
二分转化为 01 串 如果某个问题满足: 如果序列只有 0\mathtt{0}0 和 1\mathtt{1}1,问题是易解决的 答案依赖于序列中的数的大小关系 单次询问 可以考虑二分答案(或计算答案的中间变量)为 xxx,将序列中 ⩾x\geqslant x⩾x 的数置为 111,否则将 <x<x<x 的数置为 000(或 −1-1−1,按需),将序列转化为 01\mathtt{01}01 串。 【求中位数】x=an+12′x = a'_{\frac{n+1}{2}}x=a2n+1′,其中将 aaa 数组排序后为 a′a'a′。⩾x\geqslant x⩾x 的个数比 <x< x<x 的个数 恰好 要多,因此可以通过二分出一个最大的满足上述整数得到中位数。值得注意的是,如果中位数定义为 an+12a_{\frac{n+1}{2}}a2n+1,将 ⩾x\geqslant x⩾x 的数置为 111,定义为 an2a_{\frac{n}{2}}a2n,将 >x> x>x...
2026-05-30
01Trie
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121struct Node { std::array<Node*, 2> next{}; int icnt = 0;};void insert(Node*& p, int val, int bit = 30) { if (!p) { p = new Node(); } p->icnt++; if (bit == -1) return; ...
2026-06-14
多组数据
给定长度为 NNN 的序列 A=[A1,A2,…,AN]A = [A_1, A_2, \dots, A_N]A=[A1,A2,…,AN]。 定义其一个 有效分拆 为将其切分为 kkk 个相邻的子数组,各段长度依次为 L1,L2,…,LkL_1, L_2, \dots, L_kL1,L2,…,Lk(满足 Li≥1L_i \ge 1Li≥1 且 ∑i=1kLi=N\sum_{i=1}^k L_i = N∑i=1kLi=N)。 令第 iii 个子数组的起始下标为 Si=1+∑j=1i−1LjS_i = 1 + \sum_{j=1}^{i-1} L_jSi=1+∑j=1i−1Lj。 序列 AAA 被认为是合法的,当且仅当存在一种分拆同时满足以下两种条件: 条件 1(Type 1): 对于所有子数组,其首元素等于该段长度减一。 ∀i∈[1,k],ASi=Li−1\forall i \in [1, k], \quad A_{S_i} = L_i - 1 ∀i∈[1,k],ASi=Li−1 条件 2(Type 2): 第一段长度为 111...

2024-10-27
Codeforces Round 982 (Div. 2)
A. Rectangle Arrangement 取最大值的正确性:凸阶梯形平移后即是矩形,其周长与矩形周长相等。 123456789101112131415161718192021222324252627#include <bits/stdc++.h>using namespace std;using ll = long long;int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { int n; cin >> n; int X = 0, Y = 0; while (n--) { int x, y; cin >> x >> y; X = max(X, x); Y = max(Y, y); ...
評論