首先来看一道我编的题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 \(m\) 个不同的 主题 . 为了方便描述,我们对词牌名从 \(1\) ~ \(n\) 编号,对主题从 \(1\) ~ \(m\) 编号. 安娜准备了若干首诗,每首诗都有 恰好一个 词牌名与 恰好一个 主题. 更具体地说,安娜为第 \(i\) 个词牌名第 \(j\) 个主题准备了 \(a_{i…
首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 \(m\) 个不同的 主题 . 为了方便描述,我们对词牌名从 \(1\) ~ \(n\) 编号,对主题从 \(1\) ~ \(m\) 编号. 安娜准备了若干首诗,每首诗都有 恰好一个 词牌名与 恰好一个 主题. 更具体地说,安娜为第 \(i\) 个词牌名第 \(j\) 个主题准备了 \(a_{i,j…
description analysis 首先可以知道不符合要求的食材仅有一个,于是可以容斥拿总方案数减去选不合法食材的不合法方案数 枚举选取哪一个不合法食材,设\(f[i][j]\)表示到第\(i\)种烹饪方法.操作权值为\(j\)的方案数 给每一个操作赋权值,选当前行合法食材列为\(0\),不选当前行为\(1\),选当前行不合法食材列为\(2\) 转移是比较容易的,可知选当前列为不合法食材的方案数就是\(\sum_{i=n+1}^{2n}f[n][i]\) code #include<std…
luogu题目传送门! 首先,硬求可行方案数并不现实,因为不好求(去年考场就这么挂的,虽然那时候比现在更蒟). 在硬搞可行方案数不行之后,对题目要求的目标进行转换: 可行方案数 = 总方案数 - 不合格方案数. 题目多看几眼,(求最大最小方案数量这种套路),DP无疑. 首先考虑列的限制,发现若有不合法的列,则必然有且只有一列是不合法的:因为不可能有不同的两列数量都超过总数的一半. 于是发现列的合法限制数量可以如此计算:每行选不超过一个的方案数 (总数) -   每行选不超过一个,且某一列选了超过…
题目 题目链接:https://www.luogu.org/problem/P5664 Emiya 是个擅长做菜的高中生,他共掌握 \(n\) 种烹饪方法,且会使用 \(m\) 种主要食材做菜.为了方便叙述,我们对烹饪方法从 \(1 \sim n\) 编号,对主要食材从 \(1 \sim m\) 编号. Emiya 做的每道菜都将使用恰好一种烹饪方法与恰好一种主要食材.更具体地,Emiya 会做 \(a_{i,j}\) 道不同的使用烹饪方法 \(i\) 和主要食材 \(j\) 的菜(\(1 \l…
Description 传送门 Solution 算法1 32pts 爆搜,复杂度\(O((m+1)^n)\) 算法2 84pts 裸的dp,复杂度\(O(n^3m)\) 首先有一个显然的性质要知道: 最多只有一种主要食材出现在超过一半的主要食材里. 接下来考虑如果只有前两个限制条件的情况,那么答案就是 \[\Pi_{i=1}^{n} (sum_i+1) - 1\] 其中\(sum_i = \sum \limits_{j=1}^m a_{i,j}\),\(+1\)是因为对于每一行只有选一道菜或者…
这题在考场上只会O(n^3 m),拿了84分.. 先讲84分,考虑容斥,用总方案减去不合法方案,也就是枚举每一种食材,求用它做超过\(\lfloor \frac{k}{2} \rfloor\) 道菜的方案数,从总方案中减去. 先枚举一种食材x,设f[i][j][k]为前i种烹饪方法中,做j道菜,其中k道是食材x做的的方案数,转移考虑第i种烹饪方案 不做菜/做食材x的菜/做其他食材的菜 三种情况.最后所有f[n][j][j/2+1 ~ n]的和即是不合法情况. 考虑怎么优化,设一种方案中有k道菜,…
\(dp_{i,j,k}\)表示前\(i\)种烹饪方法,假设最多的是食材\(j\),食材\(j\)比其他食材多\(k\)次出现 其中\(i \in [1,n],j \in [1,m],k \in [-n,n]\) \(then \Longrightarrow dp_{i,j,k}=dp_{i-1,j,k}+\sum_{l=1}^{m}(l=j?dp_{i-1,j,k-1} :dp_{i-1,j,k+1})\) 本题主要考查滚动数组 总可能(不一定合法)为\(\prod_{i=1}^{n}(1+\…
这个D2T1有点难度啊 原题: 花了我一下午的时间,作为D2T1的确反常 条件很奇怪,感觉不太直观,于是看数据范围先写了个暴力 写暴力的时候我就注意到了之前没有仔细想过的点,烹饪方式必须不同 虽然a很大,但是n只有100,即总菜数比较小 而且虽然m和a都很大,但是一种方法只能做一道菜,即选一种食材 所以搜索枚举每种方法选哪种食材,最后检查方案是否满足条件 这样可以拿到32分 需要注意到一点很关键的性质 不管什么方案,最多只有一个食材能超过n/2,看到n/2要敏感 那么如果无视n/2的限制,直接d…
qwq 由于窝太菜了,实在是不会,所以在题解的帮助下过掉了这道题. 写此博客来整理一下思路 正文 传送 简化一下题意:现在有\(n\)行\(m\)列数,选\(k\)个数的合法方案需满足: 1.一行最多选一个 2.一列最多选\(\lfloor \frac{k}{2} \rfloor\)个数 当然,如果你在某一行里选了0,就相当于没有在这一行里选数 选一次对答案的贡献是你选的所有不为零的数的乘积.对于任意的\(k\),只要有合法方案,就能取. (希望没有把题目变得更复杂叭) 根据上面的要求,我们发现…
Description: 有 \(n\) 中烹饪方法和 \(m\) 种食材,要求: 至少做一种菜 所有菜的烹饪方法各不相同 同种食材的菜的数量不能超过总菜数的一半 求做菜的方案数. Solution1:考虑 DP 先容斥一下,答案为忽略第三个条件所得的方案数减去每一种食材超过一半的方案数之和. 忽略掉第三个条件之后答案显然是 \[ \prod_{i=1}^n(1+\sum_{j=1}^m a_{i,j})-1 \] 减去 1 是去掉一道菜都不做的方案. 枚举每一列超过一半的情况,显然,除这一列外…
题目传送门 解题思路: 对于每一个列c,f[i][j][k]表示到第i行,第c列选了j个,其它列一共选了k个,然后我们读题意发现只要j>k,那就一定是不合法的,然后统计所有方案,减去所有不合法方案,即为答案. 代码里有注释. //只做了84分,懒得写100分(思路一样),以后可能update..... 84分代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std;…
CSP-S2 2019 D2T1 很不错的一题DP,通过这道题学到了很多. 身为一个对DP一窍不通的蒟蒻,在考场上还挣扎了1h来推式子,居然还有几次几乎推出正解,然而最后还是只能打个32分的暴搜滚粗 题意分析 给出一个矩阵,要求每行只能选一个节点,每列选的节点不能超过所有选的节点的一半,不能不选,给出每个节点的选择方案数,求总方案数 思路分析 可以看出,维护每列已选的节点复杂度太大,不太可行:因此很容易想到,先不考虑每列不超过一半的这个限制,求出总方案数,然后再减去考虑这个限制后不合法的方案数.…
题面 link 前言 去年把我做自闭的一道题,看了一眼题面,发现只有 t1 有点思路,结果写到一半发现自己读错题了,又只能花时间来重构,结果后面的暴力一点都没写(主要是自己当时不会) 然后,这道题还因为某种原因爆玲了,因此我就成了全机房最菜的人. 题解 这道题题面还是很长的,所以我们简化一下题意. 给你一个 n*m 的矩阵,要求你从每一行选一个数,这一行可以选也可以不选,但最后至少选一个,且选的最多的那一列不能超过选的总数的 \(1 \over 2\) part 1 24 - 32 分 直接爆搜…
description loj 3211 solution 看到题目中要求每种主要食材至多在一半的菜中被使用,容易想到补集转换. 即\(ans=\)总方案数-存在某一种食材在一半以上的菜中被使用的方案. 总方案数很容易求:即对于每一种烹饪方法选至多一道菜的方案为\(s_i+1\),其中\(s_i=\sum_{j=1}^{m} a_{i,j}\). 故总方案数\(=\prod_{i=1}^{n} (s_i+1)-1\),其中-1是因为要去掉一道菜都没有选的方案. 而不合法的方案,我们可以先钦定第\…
64 pts 类似 乌龟棋 的思想,由于 \(64pts\) 的 \(m <= 3\), 非常小. 我们可以设一个 \(dp\),建立 \(m\) 个维度存下每种物品选了几次: \(f[i][A][B][C]\) 表示前 \(i\) 种烹饪方法,第 \(1 / 2/ 3\) 种主要食材各自选了 \(A, B, C\) 道菜的方案数. 状态转移:根据题意,每种烹饪方法最多选一道菜. 不做菜 \(f[i][A][B][C] += f[i - 1][A][B][C]\) 做 \(1\) 道第一种主要食…
链接: P5664 题意: 给出一个 \(n*m\) 的矩阵 \(a\),选 \(k\) 个格子(\(1\leq k\leq n\)),每行最多选一个,每列最多选\(⌊\dfrac k2⌋\) 个,同时每个格子有 \(a_{i,j}\) 种不同选法,问共有多少种不同的选法,对 \(998244353\) 取模.给出 \(n,m\) 和 矩阵 \(a\). 分析: 尝试直接 dp 失败后看了题解.这是道 dp 和容斥的好题. 考虑列的限制,每列最多选\(⌊\dfrac k2⌋\) 个,意味着最多只…
思路: 这种题目就考我们首先想到一个性质.这题其实容易想到:超限的菜最多只有一个,再加上这题有容斥那味,就枚举超限的菜然后dp就做完了. 推式子能力还是不行,要看题解. 式子还需要一个优化,就是废除冗余状态将二维化一维. 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=105; const int M=2005; ll mod=998244353,a[N][M],s[N],g[…
题面 题解 不考虑每种食材不超过一半的限制,答案是 减去 1 是去掉一道菜都不做的方案. 显然只可能有一种菜超过一半,于是枚举这种菜,对每个方式做背包即可(记一维状态表示这种菜比别的菜多做了多少份). 设dp[i][j]为前i种方法中这种食材比别人多j份, 则   于是从零开始枚举j就行了 吗 不对,我们可以意识到dp[i][ - | j |]也对答案有影响, 所以我们设dp[i][n]为原先的dp[i][0],n以下的是负数情况 #include<cstdio> #include<io…
S D1T2 括号树 设\(f[u]\)表示根到\(u\)的路径上有多少子串是合法括号串.(即题目里的\(k_u\),此变量名缺乏个性,故换之) 从根向每个节点dfs,容易求出\(c[u]\):表示从根到\(u\)的路径上,我们能匹配则匹配,最后剩下多少个待匹配的左括号. 例如如下\(s_u\)对应的\(c[u]\): ((() \(c[u]=2\). (())( \(c[u]=1\). (()() \(c[u]=1\). ()))( \(c[u]=1\). (()()) \(c[u]=0\).…
CSP-S 2019 游记 update 2019.11.18 考完后的第一感受 update 2019.11.24 我校某优秀学子把全SD的选手程序全测了一遍(太狠了,于是就知道了大概的惨淡成绩,大概是可怜的省二选手了 update 2019.12.13 因为某些原因又回来写gu掉的部分,然后并没写完 update 2019.12.19 考完期中回来继续补锅,期中爆炸 然后学校的12.9活动被gu成12.20 (因为太菜,所以港真是去玩了 感觉这次CSP真的发挥上巨差无疑了. 考场的机子巨巨巨…
$CSP\space S$ 格雷码 $solution:$ 直接模拟即可. 时间复杂度 $O(n)$ . #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; void solve(unsigned long long N,unsigned long long K){ ) return; unsigned long long…
CSP2019 题解 D1T1 格雷码(code) 题目传送门 https://loj.ac/problem/3208 题解 按照题意模拟就可以了. 对于第 \(i\) 位,如果 \(k \geq 2^i\) 那么这一位就是 \(1\),然后把 \(k\) 变成 \(2^{i + 1} - k - 1\).否则这一位为 \(0\),\(k\) 不变. 代码 https://loj.ac/submission/687508 D1T2 括号树(brackets) 题目传送门 https://loj.…
CSP2019题解 格雷码 按照生成的规则模拟一下即可. 代码 括号树 看到括号匹配首先想到用栈,然后又在树上就可以想到可追溯化栈. 令\(a_i=1\)表示\(i\)号节点上的括号为(,否则为), 记栈为\(stk\),其中元素个数为\(top\). 设\(f_i\)表示加上节点\(i\)所对应的括号所增加的贡献,\(g_i\)表示这个点的答案,转移很显然: \[ \begin{aligned} \begin{cases} f_i=0&(a_{fa_i}=1)\\ f_i=f_{fa_i}&am…
诈个尸 先挖坑 虽然连去都没去但还是想做做 今年貌似比去年还毒瘤啊... yrx.hjw都进了省队线tql orz (myh:没AK真丢脸 Day1T1 格雷码 Day1T2 括号树 Day1T3 树上的数 Day2T1 Emiya家今天的饭 Day2T2 划分 Day2T3 树的重心…
格雷码 €€£:我不抄自己辣!JOJO! 这题比那个SCOI的炒鸡格雷码好多了,甚至告诉你构造方法,所以... void wk(uLL kk) { int j=0; for(uLL i=n-1;~i;--i) { if(kk>>i&1) printf("%d",j^1),j^=j==0; else printf("%d",j),j^=j==1; } } 括号树 考虑朴素做法,即dfs整棵树,然后记录到根的括号序列,每个点的贡献为祖先贡献+以自己这…
我们就像一把穿刺敌人的利刃,把敌人开肠破肚----凡尔登高地前气势汹汹的德军 今天没有考试,挺好,有时间自己做题了 今天主要复习+学习了数据结构,列了个表: 已完成:单调队列,线段树,set/vector,大根堆小根堆对顶堆 2.未完成:树状数组(紧急且重要),红黑树(可能永远都不会写了),主席树,treap平衡树(紧急且重要),二叉树,权值平衡树 做的题: 1.已完成:P1801 黑匣子(对顶堆/set/vector) ,P1168 中位数(线段树/对顶堆) ,P1276 校门外的树(增强版)…
DP学习记录Ⅰ 以下为 DP 的优化. 人脑优化DP P5664 Emiya 家今天的饭 正难则反.考虑计算不合法方案.一个方案不合法一定存在一个主食,使得该主食在多于一半的方法中出现. 枚举这个"超标"的主食 \(i\).设 \(f[j][k][l]\) 表示前 \(j\) 种方法中一共选择了 \(k\) 个主食 \(i\),一共选择了 \(l\) 个主食 的方案数.最终答案为 \(f[n][u][v]\),其中 \(u > v / 2\).这样,我们得到了一种 \(O(m^2…
NOIP真题索引 NOIP2019 Day 1 格雷码 括号树 树上的数 Day 2 Emiya 家今天的饭 划分 树的重心 NOIP2018 Day 1 铺设道路 货币系统 赛道修建 Day 2 旅行 填数游戏 保卫王国 NOIP2017 Day 1 小凯的疑惑 时间复杂度 逛公园 Day 2 奶酪 宝藏 列队 NOIP2016 Day 1 玩具谜题 天天爱跑步 换教室 Day 2 组合数问题 蚯蚓 愤怒的小鸟 NOIP2015 Day 1 神奇的幻方 信息传递 斗地主 Day 2 跳石头 子…
Day1-T1 格雷码(code) 格雷码是一种特殊的 \(n\) 位二进制串排列法,要求相邻的两个二进制串恰好有一位不同,环状相邻. 生成方法: \(1\) 位格雷码由两个 \(1\) 位的二进制串组成,顺序为 \(0,1\) \(n+1\) 位的格雷码的前 \(2^n\) 个串,是由 \(n\) 位格雷码顺序排列再加前缀 0 组成. 后 \(2^n\) 个串,由 \(n\) 位格雷码逆序排列加前缀 1 组成. 求 \(n\) 位格雷码的第 \(k\) 个串. \(1\leq n\leq 64…