首页 > 其他分享 >【题解】LibreOJ #3051「十二省联考 2019」皮配

【题解】LibreOJ #3051「十二省联考 2019」皮配

时间:2023-12-06 22:11:41浏览次数:34  
标签:皮配 题解 城市 al 学校 偏好 阵营 联考 dp

传送门:https://loj.ac/p/3051     首先,对于这样“少部分个体有特殊要求”的题目,我们先考虑,如果没有任何个体有特殊要求怎么做,然后再考虑怎么加上特殊要求;
对于这道题,如果 $k=0$,即没有学校有不喜欢的导师,那么,设总人数为 $al$,城市 $i$ 的人数和为 $cit_i$、选择的阵营为 $zy_i=0/1$,学校 $i$ 的人数为 $sch_i$、选择的派系为 $px_i=0/1$(注意此时对于一个学校,其所在城市的 $zy$ 值和其自身的 $px$ 值已经唯一确定了它选择的导师),则合法方案需要满足如下条件:
$n-C_1<=\sum_{i=1}^{c}[zy_i=0]cit_i <=C_0$
$n-D_1<=\sum_{i=1}^{n}[px_i=0]sch_i <=D_0$
由于在 $k=0$ 时,所有 $zy$ 的值和 $px$ 的值是不互相影响的,二者的选值相互独立,所以我们可以把二者分开计算,二者分别的合法取值数乘起来就是答案;因此,我们进行两次 $dp$:
$dpzy_{i,j}$ 表示前 $i$ 个城市中,阵营为 $0$ 的城市一共包含 $j$ 个人的方案数;
转移方程为:$dpzy_{i,j}=dpzy_{i-1,j}+dpzy_{i-1,j-cit_i}$;
$dppx_{i,j}$ 表示前 $i$ 个学校中,派系为 $0$ 的学校一共包含 $j$ 个人的方案数;
转移方程为:$dppx_{i,j}=dppx_{i-1,j}+dppx_{i-1,j-sch_i}$;
时间复杂度为 $O(n*al)=O(10*n^2)$;
现在 $k=0$ 的情况解决了,下一步是,如果存在有不喜欢的导师的学校,如何处理;如果存在学校有不喜欢的导师,那么该学校的阵营和派系就不独立了,因此无法用上一种方式解决;
我们从最朴素的暴力重新开始考虑:枚举每个城市的阵营,再通过 $dp$ 给每个学校选择派系;枚举城市的阵营是 $O(2^c)$ 的,不能接受,考虑省掉这一步:每个学校只需要和同城市的学校选择同一阵营就行,别的城市的阵营与其无关,这使得每次都枚举所有城市的阵营很浪费;我们可以把学校按照城市排序,同城市的学校在一个连续段内,这样我们可以只维护当前连续段的 $zy$ 值;
按照这种想法的 $dp$ 大概是:$dp_{i,j,k,lst}$ 表示前 $i$ 个学校(按照城市排过序)中,有 $j$ 个人在 $0$ 阵营,$k$ 个人在 $0$ 派系,当前连续段(同城市)的 $zy$ 值为 $lst$;转移时每个状态 $O(1)$ 枚举选择的阵营和派系(注意要符合 $lst$ 和偏好两个限制),时间复杂度为 $O(n*al^2*2)=O(200*n^3)$,难以通过;
注意到 $k$ 很小,这提示我们,大部分学校和城市没有偏好限制,因此在它们身上,之前 $k=0$ 的做法还能发挥作用,我们考虑把两种做法结合起来;
直观的想法是,对于有偏好限制的城市的学校使用第二种 $dp$,剩下的使用第一种;但这样并不可行,因为如果所有的城市都存在有偏好限制的学校,那么所有的城市都必须使用第二种 $dp$,对复杂度没有改善;我们考虑,对于“所在城市内有偏好限制,但自己没有偏好限制”的学校,不用直接放进第二种 $dp$ 里,因为它们所在的阵营在把所有“自身有偏好限制”的学校决定好阵营之后就已经确定,贡献也可以在那时一起计算,而它们对于派系的贡献和阵营无关,可以在第一种 $dp$ 里计算;
因此,我们修改两种 $dp$:在第一种 $dp$ 内,对于“所在城市内有偏好限制,但自己没有偏好限制”的学校,我们不让它参与 $dpzy$ 的计算,把它的阵营留到第二种 $dp$ 决定,而 $dppx$ 的计算它照常参与;而在第二种 $dp$ 内,对于一个“自身有偏好限制”的学校,我们让它对 $j$ 的影响不再是其自身人数,而是所有与其同城市的学校的总人数,这样就抵消了 $dpzy$ 中少掉的 $j$;
总方案数即为 $\sum_{x=0}^{al}\sum_{y=0}^{al}\sum_{z=al-C_1-x}^{C_0-x}\sum_{w=al-D_1-y}^{D_0-y}(dp_{k,x,y,0}+dp_{k,x,y,1})*dpzy_{n',z}*dppx_{n-k,w}$(这里的 $alk$ 指存在偏好限制的学校总人数,$n'$ 指所有不存在偏好限制的城市内的学校数),后面的两个 $\sum$ 可以通过前缀和轻松消掉;
综上,第一种 $dp$ 的时间复杂度为 $O(n*al)=O(10*n^2)$,第二种 $dp$ 由于只有存在偏好限制的城市参与,时间复杂度降为 $O(k*alk*al*2)=O(200*k^2*n)$ ,最终的求和 $O(al^2)=O(100*n^2)$ ,可以通过。

标签:皮配,题解,城市,al,学校,偏好,阵营,联考,dp
From: https://www.cnblogs.com/hellstairs/p/17880655.html

相关文章

  • UVA753 A Plug for UNIX 题解
    LinkUVA753APlugforUNIXQuestion有\(n\)个插座,\(m\)个设备和\(k\)种转换器,每种转换器有无限多个。转换器可以插着转换器用,每个插座或插头的类型可能不同,求最少剩多少个不匹配的设备Sulotion先考虑转换器连用的情况,用边表\(G[x][y]\)表示\(x\)类型可以转换成\(y......
  • UVA1395 Slim Span 题解
    LinkUVA1395SlimSpanQuestion求所有生成树中最大边权与最小边权差最小的,输出他们的差值Solution因为\(n\le100\)非常小,先把边从小到大排序,那么生成树的边肯定是排序后上的边连续的一块所以,可以枚举连续一块的起点\(L\),\(R\)从\(L\)往后推,判断全图连通性,如果已经完......
  • CF1809D Binary String Sorting 题解
    题意:思路:贪心:单调不降的$01$字符串,一定是一串连续的$0$再加上一串连续的$1$。由于每次操作的代价很大,所以需要在操作次数尽可能少的情况下,尽可能多地使用交换操作。由于$1$次交换操作,只能减少$1$个逆序对,当存在多个逆序对时,优先通过删除操作减少逆序对的......
  • ucup hefei 题解
    比赛链接B很有意思的题首先题目的要求为可以拆分成\(2\)个不相交的不降子序列根据\(dilworth\)定理,最小链覆盖\(=\)最长反链,所以要求最长反链\(\le2\)即原序列的逆序列的最长不降子序列长度\(\le2\)不难得到一个\(dp\)做法为:令\(f_{i,j}\)为到数\(i\),最长上......
  • python HTML文件标题解析问题的挑战
    引言在网络爬虫中,HTML文件标题解析扮演着至关重要的角色。正确地解析HTML文件标题可以帮助爬虫准确地获取所需信息,但是在实际操作中,我们常常会面临一些挑战和问题。本文将探讨在Scrapy中解析HTML文件标题时可能遇到的问题,并提供解决方案。问题背景在解析HTML文件标题的过程中,......
  • Error: error:0308010C:digital envelope routines::unsupported 【问题解决】【转载
    原文链接:  https://www.cnblogs.com/jaxu/p/17171211.html今天早上打开电脑,更新了日常工作的github仓库,然后就是习惯性地执行了"npminstall",发现报了下面这个错误:Error:error:0308010C:digitalenveloperoutines::unsupported顺便看了一下错误堆栈,发现是一个Node......
  • 线性代数题解
    前言写完了这道题我好想刚明白一点最小割???UU好闪,拜谢UU。题解首先,我们可以发现若第\(i\)行的\(B\)没选,那么第\(i\)列的\(B\)也不选,所以此时对于行和列是等价的。若\(A_i\)是\(0\),则会减少贡献\(\sum_{j}B_{i,j}\)。否则会减少贡献\(C_i\)。当\(A_i\)是\(0\)......
  • CF603题解
    CF603CodeforcesRound334(Div.1)CF603AlinkCF603A题意现有一个长度为\(n\)的01串,可以进行一次区间翻转(起点终点随意,并且区间里的值1变0,0变1),得到一个新的01串,使得得到的新的01串中的一个子串最长(子串不一定连续),且这个子串是01间隔的,没......
  • CF1824B1 LuoTianyi and the Floating Islands (Easy Version) 题解
    题意:思路:由于$k∈[1,3]$,分类讨论:当$k=1$时,有人结点自身即为好结点,每种情况的期望为$\frac{1}{n}$,$n$种情况的期望和为$1$。最终答案即为$1$。当$k=2$时,$2$个有人结点之间的路径上的结点即为好结点,那么问题转化为:树上所有路径的结点......
  • ABC325G offence 题解
    给出一个长为\(n\)的字符串和非负整数\(k\)。你可以进行以下操作若干次,使得最终字符串长度最小。选择一个字串of。然后删掉of以及这之后的\(i\)个字符。\(i\)由你决定,但要满足\(0\leqi\leqk\)。输出这个最小长度。\(1\leqn,k\leq300\)。做完以后感觉很简单。但......