By jiry_2
这题数据是瞎随的,所以好像出现了一些奥妙重重的得分分布QAQ
算法一
爆枚所有可能的情况,检验每一个限制是否合法。
时间复杂度 ,期望得分 分。
算法二
不难发现当 时后 位用户中,恰好有 位投了通过肯定是不成立的,当 时后 位用户中,恰好有 位投了通过也肯定不成立。
所以只有当 时限制是唯一确定的。
因此如果有解,本质不同的限制最多只有 个,可以先把不同的限制去重掉,然后再爆枚所有情况判断。
时间复杂度 ,期望得分 分。
算法三
对于第六个点,所有限制都是针对前缀的。
不难发现这时限制把整个序列分成了 段并对每一段限制了 的个数,因此每一段的方案数都是组合数,直接把它们都乘起来就好了。
时间复杂度 ,结合算法二期望得分 分。
算法四
先考虑 的情况,这时考虑把对后缀的限制转化成对前缀的限制。
枚举所有人中投通过的人数,这样后缀的限制就变成了前缀的限制,直接用算法三求解就好了。
存在 时,不难发现所有 的限制中只需要考虑 最大限制就行了,因为这个限制满足了剩下的 的限制一定也满足了。
枚举限制 被哪一边满足,答案就是前缀满足的方案数加上后缀满足的方案数减去两端都满足的方案数,这样就把 转化成了只对前缀或者只对后缀的限制。
时间复杂度 ,期望得分 分。
By sevenkplus,题解By C_SUNSHINE
算法一
暴力枚举每个人是否是罪犯,然后扫描所有证言判断是否为真,并判断是否满足条件,时间复杂度。
算法二
对于每个人,建立一个变量表示他是否是罪犯,对每一条证言,建立一个变量表示它是否为真,那么就可以把要求转化为一些条件。
对于一条供词,建立条件:“若此供词为真,则某个人是/不是罪犯”。
接着对于每个人,建立条件:“若此人不是罪犯,则其说的每一条证言都为真”。
由于一个人最多说一句假的供词,则对于同一个人说的任意两条供词,建立条件:“若供词A为假,则供词B为真”。
条件都可以写成“若则”的形式,这是一个2-SAT问题,可以使用经典的强连通分量算法求解。
时间复杂度。
算法三
对于完全图的情况,可以先特判所有人都是罪犯的情况,否则必有一个人不是罪犯,枚举任意一个人不是罪犯,则通过他的供词可以得知其他所有人是否为罪犯。
时间复杂度。
算法四
考虑推广算法二,对一个有条供词的人,建立个变量,分别表示第条供词是否为真,前条供词是否都为真,后条证词是否都为真。
那么若前条供词为真,则前条供词也为真,且第条证词也为真,对于后缀也是一样,这部分边数是的。
那么可以建立条件的时候就可以使用前缀后缀来优化,若一个人为真,只要长度为的前缀都为真即可。
对于一个人最多说一条假的供词这个限制,若一个人的第条供词为假,则前条和后条证词都为真,这部分的条件数就变成的了。
于是变量数和条件数都是的,总复杂度就是。
By SkyDec
算法一
考虑化简方差,设d为每次经过的点的个数。
根据平均数的定义,有
所以有
可以很简单地计算,于是问题就变成了:求和,即经过的点的个数的平方之和,经过的点的个数之和。
我们可以枚举每次往哪个方向走,统计一下经过了几个点,就可以直接计算了。
时间复杂度,期望得分20分
算法二
考虑部分分
即不可能往左右走,也就是说行走的区域只有一维了。
一维区域经过的点显然是一个区间,经过的点就是这个区间里整点的个数。
令表示走了步,当前经过的区间为,当前的位置是的方案数,直接模拟下一步往哪儿走转移即可。
时间复杂度O(n^4),期望得分20分
算法三
考虑如何快速地计算。
考虑计算,也就是经过一个点时上次早已经过这个点的点的个数。
显然。
考虑一段长度为的序列,每个元素是中的一种。
那么如果对于坐标,设序列为满足的所有按顺序排列的序列
那么对应的,对于,有(
可以发现,一个出现了次的点产生了段没有前缀的和为的序列。
而显然出现了次的点对我们要求的答案的贡献是。
所以根据期望的线性性,我们只要计算有多少段连续子序列满足和为且没有前缀即可。
设表示长度为的答案。
设表示长度为的和为的序列有几种。显然是奇数时,。
相当于枚举每种向量的个数,排列组合了一下。
然后的计算就很显然了。
统计答案时只要算就行了
时间复杂度,期望得分分
算法四
在上个算法里,我们通过比较直观的转换将题目转化成了求无前缀的和为的段数。
然而当我们求时,就无法直接用期望的线性性计算了。
设,即上个算法里的重复计算次数。有:
我们已经可以轻易地计算了,现在就考虑计算了。
设布尔数组a[l][r]表示是否满足条件。
那一个数列的贡献就是
即
然后现在就有期望的线性性了,我们只要对于每对,计算他们同时满足条件的方案数即可。
当区间不相交时,他们互相几乎不影响,直接计算即可。
当只有一段时我们可以简单地记录坐标,并保证中途不经过为的点即可。
那么当有两个区间时,我们可以先第一个区间,然后中途加入一个区间,当一个区间和变为时就意味着他终止了。
当区间相交时,考虑表示当前长度为,第一段的和为,第二段的和为。当前有几个区间。每次转移考虑下一步走哪个方向,要不要加入区间即可。
时间复杂度,期望得分40分
算法五
考虑第七个点,他的,显然之间是一种比例关系,全部相等就等价于全为,我们用上个算法的程序打个表即可。
期望得分10分
算法六
区间的相交分为两种情况:包含和不包含。
我们先考虑不包含的情况,这样肯定分成了三段:只属于第一段的,重合的,只属于第二段的,我们设他们分别为,,。
考虑,我们枚举的和,设为,那么我们可以轻易地推导出:B的和为,C的和为。
考虑需要满足什么条件,由于只属于第一段,所以只需要满足没有前缀即可。
设表示和为(x,y),长度为,没有前缀的方案数,这个可以用简单的dp得到。
考虑需要满足什么条件,由于只属于第二段,所以只需要满足没有前缀即可,即没有后缀。
没后缀跟没前缀显然是等价的问题。
考虑需要满足的条件,这个就比较复杂了,毕竟是重合的部分,他要满足第一段,所以他需要没有前缀,即没有后缀
他也需要满足第二段,即没有前缀。
设表示和为,长度为,没有前缀和后缀的方案。
考虑容斥计算。我们可以用作为总方案,那么考虑枚举最短的长度为的后缀和为。
那么前的和就是,他们只需要满足没有前缀,也就是。
考虑长度为的部分,他们的和为,由于要求最短,所以他们也不能有后缀,并且由于整段里不能有前缀,所以他也不能有哪个前缀和前面的构成,即没有前缀。
于是设表示长度为,和为,不能有前缀和前缀的方案数。
考虑容斥,设表示长为,和为的段数,那么可以以作为的初值。
考虑枚举第一次违反,设长度为。
当违反的是不能有前缀时,相当于要求长度为,和为,不能有前缀和前缀的序列个数,可以由转移过来。
当违反的是不能有前缀时,相当于要求长度为,和为,没前缀和前缀的序列个数,即前后缀都不为的序列个数。可以由转移过来。
而上面的是从转移过来的,并且每次转移长度都会变大,我们可以枚举长度从小到大后一起计算和。
考虑计算答案:
设
那么答案就是
以上大多数状态数都是,转移都是容斥,所以复杂度是。
考虑包含的情况,类似的,我们把他分成三段,并枚举的坐标为。
那么的坐标和为,的坐标和为。
只要满足没有前缀,只要满足没有后缀。
要满足没有前缀且没有前缀,即。
考虑计算答案:
我们可以类似上面地优化一下即可。
时间复杂度,由于很多状态其实是没用的,可以在内通过
期望得分分