首页 > 其他分享 >P5999 [CEOI2016] kangaroo 题解

P5999 [CEOI2016] kangaroo 题解

时间:2023-01-09 16:44:24浏览次数:45  
标签:题意 int 题解 kangaroo P5999 MAXN dp mod

分析

一个妙妙的 trick。

首先原题可以转化成求有多少 \(1 \sim n\) 的排列 \(p\) 满足 \(\forall i\in(1,n)\),\(p_i\) 两边的数同时小于或大于 \(p_i\),且 \(p_1=s,p_n=t\)。这类题都可以采用插入法 dp。

首先设状态,\(dp_{i,j}\) 表示前 \(i\) 个数,分成 \(j\) 段的方案数。从小到大加入每一个数,考虑现在枚举到 \(i\),若 \(i \neq s\) 且 \(i\neq t\),则可以分三种情况讨论:

  1. 新开一段

    由于后加入的一定比 \(i\) 大,所以以后插入在 \(i\) 两边的数一定比 \(i\) 大,所以总是合法。此时上一步操作完有 \(j-1\) 段,所以有 \((j-1)+1=j\) 个空可以放。但是如果 \(i>s\) 说明头不能放,同理 \(i>t\) 说明尾不能放。因此有转移:

    \[dp_{i,j}=(j-[i>s]-[i>t]) \times dp_{i-1,j-1} \]

  2. 接在某一段头/尾

    这样的话以后一定会有一个 \(>i\) 的数接在 \(i\) 另一侧,\(i\) 两侧就有一个大于它的和一个小于它的,与题意不符,所以不会有这种情况。

  3. 将两段连起来

    此时 \(i\) 两侧的都比它小,与题意相符。上一步操作完有 \(j+1\) 段,有 \(j+1-1=j\) 个空可以插,因此有转移:

    \[dp_{i,j}=j\times dp_{i-1,j+1} \]

最后一定是整体一段,故答案为 \(dp_{n,1}\)。

核心代码

const int MAXN=2e3+7;
const int mod=1e9+7;
int n,s,t,dp[MAXN][MAXN];
signed main(){
    qread(n,s,t);int i,j;dp[1][1]=1;
    for(i=2;i<=n;i++){
        for(j=1;j<=i;j++){
            if(i!=s&&i!=t) dp[i][j]=(j*(dp[i-1][j+1])%mod+(j-(i>s)-(i>t))*dp[i-1][j-1]%mod)%mod;
            else dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
        }
    }printf("%lld\n",dp[n][1]);
    return 0;
}

标签:题意,int,题解,kangaroo,P5999,MAXN,dp,mod
From: https://www.cnblogs.com/lxy-2022/p/P5999-Solution.html

相关文章

  • WC 2018 题解
    A若干套路拼起来的胖题。设这三棵树分别是\(T_1,T_2,T_3\)。沿用“CTSC2017暴力写挂”的思路,对第一棵树点分治,此时要处理的是以\(u\)为中心的一块在\(T_1\)上的连......
  • CF652F 题解
    题意传送门在一个长度为\(m\)的圆环上有\(n\)只初始位置互不相同的蚂蚁,每只蚂蚁的速度都为\(1\),初始方向为顺时针或逆时针;两只运动方向不同的蚂蚁相遇时会调转方向,......
  • Codeforces 1671 F Permutation Counting 题解
    题目链接把\(p_i>p_{i+1}\)的位置个数称为间隔数首先想到一个暴力做法。从小到大挨个添加1-n中的每个数,注意到添加数i时,只能添加到当前序列的最后11个位置中,否则逆序对数......
  • 2018年各大赛事题解
    大多数题解都是口胡,不保证正确性,有错请指出,谢谢。CQOI2018除了“交错序列”和“九连环”两道数学题以外,全是板子题,遭不住了。破解D-H协议BSGS板子题,时间复杂度\(\m......
  • Atcoder ABC284 前五题题解
    ABC284A-SequenceofStrings题意:有n个字符串\(s_1,s_2,s_3,...,s_n\),要求按\(n,n-1,n-2,...,1\)的顺序输出样例:输入3TakahashiAokiSnuke输出......
  • Codeforces 1305 F Kuroni and the Punishment 题解 (随机算法)
    题目链接首先注意到每个数最多操作1次就能让他变成2的倍数,所以答案\(\len\)。如果我们能枚举[1,1e12]中所有的质数,并对每个质数p求出把数组中所有数都变成它的倍数的最少......
  • 【题解】P5666 [CSP-S2019] 树的重心
    感觉对重心的理解更直观了一点。题意求一棵树上删去每一条边后两侧子树重心的编号和。\(n\leq3\times10^5\)思路神奇的清真数论。首先这里有一步很妙的操作:把整......
  • LeetCode 887. 鸡蛋掉落-题解分析
    题目来源887.鸡蛋掉落题目详情给你k枚相同的鸡蛋,并可以使用一栋从第1层到第n层共有n层楼的建筑。已知存在楼层f,满足 0<=f<=n,任何从高于f的楼层落......
  • P3829 题解
    题目传送门二维凸包模板传送门题目分析类似于凸包模板的一道题。我们循序渐进地考虑,当半径\(r=0\)时,显然是一个二位凸包模板。接着我们将圆弧加进去,仔细观察发现,我......
  • SYUCT第五次限时训练题解
    第五次限时训练题目大意及ac代码Maxmina题目大意accode#include<iostream>usingnamespacestd;intT,n,m;inta[55];intmain(){cin>>T;whil......