首页 > 其他分享 >「CSP-J」做题记录

「CSP-J」做题记录

时间:2024-09-29 18:12:24浏览次数:6  
标签:字符 cnt le 记录 CSP operatorname dis

「CSP-J」做题记录

记号:

  • A:自己做出来的。
  • B:看题解提示做出来的。
  • C:对着题解做出来的。

  1. [CSP-J2019 江西] 道路拆除 (A)

    我们可以把问题转化一下:求出最少要留下多少边,使得从首都出发,能到达 \(s_1\) 号与 \(s_2\)号城市,且所要花费的最短时间分别不超过 \(t_1\)与 \(t_2\)。最终答案就是 \(m\) 减去最少剩下的边数。

    \(s_1 = s_2\) 时是好做的:跑一遍最短路即可。

    \(s_1 \not= s_2\) 时,\(1 \mapsto s_1\) 和 \(1 \mapsto s_2\) 两条最短路最开始是重合的(至少共有 \(1\) 这个节点)。我们假设在某个点 \(u\) 以后,两条路径没有公共边。那么我们可以枚举所有的点作为 \(u\),用 \(\operatorname{dis}(1 \mapsto u) + \operatorname{dis}(u \mapsto s_1) + \operatorname{dis}(u \mapsto s_2)\) 来更新最少剩余边数。那如果在两条路径分开之后,在某个地方又重合了呢?容易证明,在我们枚举点的过程中,一定可以找到一个更优的点来替换掉这种情况(此处有张图会更好理解,但我懒得画了),所以这种方法是正确的。

  2. [CSP-J2019 江西] 次大值 (A+B)

    自己写对了,但一些结论看了题解才完全想清楚。

    首先排序+去重,设排序后的数组为 \(b\)。

    运用取模的两个关键的不等式:\(a \bmod b < b\) 和 \(a \bmod b \le a\),当且仅当 \(a < b\) 时等号成立。换句话说,如果 \(a < b\),取模的结果比二者都小。

    把除了 \(b_{n-1}\) 以外的数模上它可以得到它本身,所以最大值一定是 \(b_{n-1}\),而次大值不小于 \(b_{n-2}\)。另一方面,\(b_{n} \bmod b_{n-1}\) 可能大于 \(b_{n-2}\),但其它任意两个数取模一定小于 \(b_{n-2}\) (根据上文的不等式)。所以比较这两种情况即可。

  3. [CSP-J2019 江西] 非回文串 (A)

    正难则反,考虑计算回文串的个数,用 \(n!\) 减去回文串的个数即为答案。

    设 \(\operatorname{cnt}(c)\) 表示原串中字符 \(c\) 的个数。显然,若超过一个字符出现的个数为奇数,那么不可能组成回文串。下面假设所有字符出现的个数均为偶数。(如果恰有一个字符出现的次数为奇数,可以转化到都是偶数的情况。)

    先考虑组合,再考虑顺序。

    组合:对于每个字符 \(c\),必须恰好选择 \(\dfrac{\operatorname{cnt}(c)}{2}\) 个字符在串的前半部分,剩下 \(\dfrac{\operatorname{cnt}(c)}{2}\) 个在串的后半部分。贡献为 \(\dbinom{\operatorname{cnt}(c)}{\operatorname{cnt}(c) / 2}\)。

    顺序:组合方式固定后,对于前半部分,有 \((n/2)!\) 种排序方式。而后半部分的“样子”可以根据前半部分确定。由于字符的数量可能不止一个,所以即使后半部分的样子已经确定,它的方案数也不是 \(1\),而是每种排列出现的次数。换句话说,假设前半部分已经确定,则后半部分的方案数为 \(\prod_{c} (\operatorname{cnt}(c)/2)!\)。

    综上所述,当所有字符出现的次数都为偶数时,回文串的个数为

    \[\prod_{c}\dbinom{\operatorname{cnt}(c)}{\operatorname{cnt}(c) / 2} \times (n/2)! \times \prod_{c} (\operatorname{cnt}(c)/2)! \]

    如果有一个字符出现的次数是奇数,我们可以选择这种字符中的一个放在串的正中间。设出现次数为奇数的字符为 \(ch\),则方案数在上式的基础上再乘上 \(\operatorname{cnt}(ch)\)。

  4. [CSP-J 2022] 上升点列(A)

    唉唉,dp。

    以下把题目中的 \(k\) 成为 \(m\)。

    先把所有点以横坐标为第一关键字,纵坐标为第二关键字,从小到大排序。

    设 \(f(i, k)\) 表示在前 \(i\) 个点中选点,并加入 \(k\) 个点时,能获得的最大长度。

    转移时,枚举所有在 \(i\) 左下方(即纵坐标和横坐标都不大于 \(i\) 的坐标)的点 \(j\)。设 \(i\),\(j\) 之间的曼哈顿距离为 \(dis\),那么我们用 \((dis - 1)\) 个新的整点填满 \(i\),\(j\) 之间的路径,尝试用 \(f(j, k - (dis-1)) + dis\) 更新 \(f(i, k)\)。

    这里有一个问题:我们我们用 \((dis - 1)\) 个新的整点填满 \(i\),\(j\) 之间的路径,但图中本来就有其它的点,因此可能用少于 \((dis - 1)\) 个点就能填满 \(i\),\(j\) 之间的路径。那么这个转移方程错了吗?

    实际上它仍然是对的。这里的关键思想是:对于计算”最优值“的题目,在用某些方案去更新状态时,我们可能没有计算出这个方案的真实值,但我们能证明一定存在某种更优的方案,这种方案会覆盖掉原先那种无法计算出真实值的方案,因此不用去考虑它。这个思想在很多题目都有用到,不只是 dp(例如上文的[CSP-J2019 江西] 道路拆除 )。

    最后是一些细节:

    初始化:对于所有的点 \(1 \le i \le n\),\(f(i, 0) = 1\)。

    答案统计:\(ans = \max_{1 \le i \le n, 0 \le k \le m}(f(i, k) + m - k)\)。加上 \(m - k\) 是考虑到了最后可能没有用完所有的点。这里仍然用到了上文中的思想——可能从某个点结束时,不能在不重合的情况下再多放出 \((m - k)\) 个点与它相连(比如这个点被包围了),但是这种情况一定不是最优的,所以不用考虑它。

标签:字符,cnt,le,记录,CSP,operatorname,dis
From: https://www.cnblogs.com/dengstar/p/18440547

相关文章

  • 「CSP-S」 做题记录
    「CSP-S」做题记录[CSP-S2019江西]多叉堆自己做出来了,开心捏。先考虑对于一棵特定的树,如何计算答案(对应特殊性质1)。首先,根节点一定只能填\(0\)。其次,可以发现各个子树不会互相影响,所以可以分别考虑如何填各个子树。设填满以节点\(u\)为根的子树的方案数为\(f(u)\),\(......
  • 「比赛记录」AtCoder abc373 (9.28)
    CTH想看F题解,于是先发出来F.KnapsackwithDiminishingValues属于是翻译官方题解了首先我们设\(dp_{w,j}\)表示从权重为\(w\)或更小的物品中选总重为\(j\)的物品可以得到的最大幸福度。考虑\(dp\)的转移。我们把所有物品按照权重\(w\)分为多组,(每一组中所有物品......
  • spring 常见注解记录+ 使用自定义注解与aop 记录接口请求参数
    注解定义:importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;importorg.springframework.core.annotation.Alias......
  • 论文速读记录 - 202409
    这次是KDD2024专场。目录:DeepBag-of-WordsModel:AnEfficientandInterpretableRelevanceArchitectureforChineseE-Commerce【词袋模型和语言模型结合,构建可解释的相关性计算方法】UnderstandingtheRankingLossforRecommendationwithSparseUserFeedba......
  • 小主机虚拟化平台搭建记录
    小主机搭建虚拟化的一些记录:1,如果主机是Intel平台,目前建议还是使用VMwareEsxi6.7,如果你的主机网卡驱动没有包含在ESXI官方安装包内,去恩山找封装了网卡驱动的版本https://www.right.com.cn/FORUM/thread-7881507-1-1.html 2,如果你的主机是AMD平台,并且是ZEN系列,那么优先选......
  • csp-s模拟6
    A.一般图最小匹配\(m\)小于\(\frac{n}{2}\)所以对原数组排序后做差分,差分后的数不能选相邻的,设\(f_{i,j,0/1}\)表示前\(i\)个,选了\(j\)个,第\(i\)个选没选直接\(dp\)求最小值就行点击查看代码#include<bits/stdc++.h>constintmaxn=5001;usingnamespacestd......
  • 记一次触发器用最新一条记录更新另外一条记录字段值的操作
    查询数据库里面最新一条记录的正确思路数据库里面的记录肯定有时间字段,找到时间的最大值,在where里面查询最新的的时间触发器查询的时候应该加上时间限制,不然随着时间的推移查询越来越慢触发器应该是beforeinsert类型不然会存在递归引用使用oracle函数或者mysql函数来执行时......
  • Git仓库代码在不同操作系统里结尾^M问题的记录
    每次按键盘上的Return时,会插入一个称为行结束符的不可见字符^M。不同的操作系统处理行结束符的方式不同。在使用Git或者GitHub协作处理项目时,Git可能产生意外结果。例如,您在Windows计算机上操作,而您的协作者是在macOS或者Linux中做的更改。您可以将Git配置为自动处理行结束符,以......
  • 浅浅记录学习情况叭
    BasicConcepts对于一个给定的网络G=(V,E),其中V为网络的节点集,E为网络的边集.Trace(迹):将G划分为q个社区,我们用一个qxq的对称矩阵e来表示该划分,e中的每个元素表示连接社区i与社区j的边在G的全部边中所占的比例显然有∑i,jeij=1。矩阵e的迹Tr(e)表示连接社区内部节点的边......
  • csp-s模拟5
    A.光来自\(K8\)的神奇做法,根据贪心思想,一个点减四个亮度可以收益最大化,所以枚举四个灯亮度都不足4时的最终态,然后看剩下需要亮度需要减的次数,每次选最大的那个操作就行,复杂度\(O(16n)\)点击查看代码#include<bits/stdc++.h>constintmaxn=1e5+10;usingnamespacestd;......