首页 > 其他分享 >NOIP2024集训 Day37 总结

NOIP2024集训 Day37 总结

时间:2024-09-24 14:50:06浏览次数:1  
标签:相同 int Day37 个数 NOIP2024 长度 集训 dp mod

前言

今天的题目也是比较快速的做完了。

所以先来总结一下。

今天是计数专题,组合数居多。

以前做过的题目这里就稍稍略过了。

Merge Triplets

观察到对于能够得到的最终的排列 \(p\),对于其中的一个数 \(p_i\),不可能做到 \(p_i>\max_{j=i+1}^{i+3}p_j\)。

感觉是比较显然的,这里就不仔细证明了。

为了方便转化这个性质,我们考虑对 \(p\) 求一个前缀 \(\max\) 数组 \(q\),他一定满足最长的连续相同的段 \(\le 3\)。

而我们看每一个块对这个连续段的贡献,一定会分为以下三种:

  • 直接贡献一个长度为 \(3\) 的相同段。

  • 贡献三个长度为 \(1\) 的相同段。

  • 贡献一个长度为 \(1\) 的相同段和一个长度为 \(2\) 的相同段。

我们考虑相同段满足哪些条件才是充分的。

首先一个很必要的是所有相同段的长度 \(\le 3\),但是显然满足这个条件的排列不一定能被构造出来。

然后我们观察上面的三种贡献可以得到一个点:长度为 \(1\) 的相同段的个数一定 \(\ge\) 长度为 \(2\) 的相同段。

而这两个条件加起来就是充分的了,也就是说只要满足这两个条件的所有排列都是合法的。

但是显然我们不能把长度为 \(1\) 的相同段和长度为 \(2\) 的相同段的个数都记下来,这显然时间复杂度会炸。

故我们考虑记录长度为 \(1\) 的相同段和长度为 \(2\) 的相同段个数的差

定义 \(dp_{i,j}\) 表示算了 \(i\) 个块的贡献,长度为 \(1\) 的相同段个数 \(-\) 长度为 \(2\) 的相同段个数为 \(j\)。

转移如下:

dp[i + 1][j + 1 + m] += dp[i][j + m], dp[i + 1][j + 1 + m] %= mod;
dp[i + 2][j - 1 + m] += dp[i][j + m] * (i + 1ll) % mod, dp[i + 2][j - 1 + m] %= mod;
dp[i + 3][j + m] += dp[i][j + m] * (i + 1ll) % mod * (i + 2) % mod, dp[i + 3][j + m] %= mod;

看上去有点抽象对吧。确实是这样的。

我们以第三行的转移为例来解释。

你可以考虑把他理解成一个树上拓扑序的个数,即我们定义第 \(i\) 个块的第 \(j\) 的数为 \((i,j)\)。那么你考虑将 \((i,1)\) 与 \((i-1,1),(i,2),(i,3)\) 连边,本质上就是表示他比这三个数大。

而你把他理解为拓扑序的方案数就可以得到上述转移。

/*
纵使我发现了不可能x[1]>x[2],x[3],x[4]
我也想不到前缀MAX会相同
qwq
*/
#include <bits/stdc++.h>
using namespace std;
#define maxn 6005
int m = 6000;
int dp[maxn][maxn << 1];
int n, mod;
int main()
{
    cin >> n >> mod;
    n *= 3, dp[0][m] = 1;
    for (int i = 0; i < n; ++i)
    {
        for (int j = -i; j <= i; ++j)
        {
            if(!dp[i][j + m]) continue;
            dp[i + 1][j + 1 + m] += dp[i][j + m], dp[i + 1][j + 1 + m] %= mod;
            dp[i + 2][j - 1 + m] += dp[i][j + m] * (i + 1ll) % mod, dp[i + 2][j - 1 + m] %= mod;
            dp[i + 3][j + m] += dp[i][j + m] * (i + 1ll) % mod * (i + 2) % mod, dp[i + 3][j + m] %= mod;
        }
    }
    int ans = 0;
    for (int j = m; j <= 2 * m; ++j) ans += dp[n][j], ans %= mod;
    cout << ans << endl;
}

Guessing Permutation for as Long as Possible

标签:相同,int,Day37,个数,NOIP2024,长度,集训,dp,mod
From: https://www.cnblogs.com/SFsaltyfish/p/18429138

相关文章

  • [32](CSP 集训) CSP-S 模拟 3
    A奇观考虑到CCF可以拆开算,答案为\((ans_c)^2\timesans_f\)剩下的东西比较少,考虑DP我的dp是从爆搜改的,设\(f_{i,j}\)表示递归到第\(i\)层时\(j\)的方案数,原始的爆搜代码如下:intdfs_f2(intnow,intid){if(now==0)return1;if(now==1)returnf_c[0][......
  • NOIP2024集训Day36 DP优化
    NOIP2024集训Day36DP优化A.[NOIP2023]天天爱打卡前段时间才看过这道题。dp+线段树优化+离散化。经典。考虑朴素dp。定义\(f_i\)表示考虑到第\(i\)个位置,并钦定第\(i\)天跑步的最大能量值。枚举最后一段跑步时间,有:\(f_i=\max(\max\limits_{k\ltj}f_k-(i-......
  • CSP 集训记录
    用来整理模拟赛等9.23csp-3【noip23ZR二十连测DAY10】保龄.A.奇观狗市题目描述。不是这题意太大歧义了吧,我讨厌的第二种出题人——题意描述相当不清。CTH:13座城市又不代表是13座不同的城市。直接看形式化题目的话(如果能看懂要干什么)那这题确实不难。解:容易发......
  • 集训 · 第一幕
    原头图另:这次的标题和摘要来自你原的主线/传说开始时的字幕9.23上午打去年买的zroinoip模拟题开t1给我干傻了,差点似在签到上发现一个不会推式子的解决办法(仅适用于签到):意会出暴力并打出来就好优化了(t2看的时候觉得是个树剖,就只打了个暴力润t3没细看,以为是二分......
  • 【题解】Solution Set - NOIP2024集训Day36 dp 优化 + 状态设计
    【题解】SolutionSet-NOIP2024集训Day36dp优化+状态设计https://www.becoder.com.cn/contest/5550最后一题较难。「NOIP2023」天天爱打卡考虑dp。\(f_{i,j}\):前\(i\)天,到第\(i\)天为止连续打卡\(j\)天。有转移:\[f_{i,0}=\max(f_{i,j})\\f_{i,j}=\max(f_{i......
  • 【2024.09.15】NOIP2024 赛前集训(2)
    【2024.09.15】NOIP2024赛前集训(2)A最大的难点戏剧性地变成了二叉搜索树是什么。先根据已知序列把二叉树建出来,忘了二叉搜索树的移步二叉搜索树&平衡树-OIWiki(oi-wiki.org)根据题意,想到dp计数,\(f[u]\)表示\(u\)子树内的答案,则有转移:\[f[u]=f[lson]\timesf[r......
  • NOIP2024模拟赛7 总结
    NOIP2024模拟赛7总结A.恰钱没啥好说的。赛场就过了。比较难蚌的是,第一遍本地测的时候没有写spj,导致我们很多人T1都直接挂零了。不过后来配上重测了。B.排序由于某种神秘原因,导致线段树build写的范围是\(1\simn+1\),update的时候写的也是\(1\simn+1\),然而que......
  • NOIP2024集训 Day33 总结
    前言若巅峰不在,那就重踏来时之路。今天是\(\texttt{DP}\)优化专题,感觉只要写出了暴力,剩下的部分都挺典的。怎么说,感觉今天状态不太好,老是细节上出现一些很逆天的错误。例如:for(autoi=dp.begin();i!=dp.end();++i){pair<ll,ll>j=*i;ans=j.first......
  • 【题解】Solution Set - NOIP2024集训Day32 数位 dp
    【题解】SolutionSet-NOIP2024集训Day32数位dphttps://www.becoder.com.cn/contest/5537order:1,3,5,6,2,4「SDOI2013」淘金就是要算前\(k\)大的和。考虑一个位置\((i,j)\)在变化完了之后的金子个数。(也即逆变换。设:\(f^\prime(x)\)表示在\(1\simN\)范围内,数位......
  • [清华集训2012] 串珠子
    [清华集训2012]串珠子题意给定\(n\)个点和\(n\timesn\)的矩阵\(c\)。有\(c_{i,j}\)种方案把点\(i\)和点\(j\)连接起来。求有多少种方案使得整张图连通。思路注意到\(1\len\le16\),考虑状压。定义\(g_i\)为集合\(i\)的连边方案数,有\[g_i=\prod_{u,v\i......