首页 > 其他分享 >题解:P7836 「Wdoi-3」夜雀 collecting

题解:P7836 「Wdoi-3」夜雀 collecting

时间:2024-11-14 21:47:50浏览次数:1  
标签:collecting 状态 题解 超集 合法 枚举 子集 Wdoi 转移

题解摘自做题记录

分析

数据范围明显得要让我们分开搞。

【Sub2】

应该是暴力。这里有个主体思路,我们完全可以贪心地将当前背包里的食材删掉,直到每种出现过的食材数量刚好为 \(1\)。因为我们保留更多的是没有用的。那么我们就可以用二进制数表示 \(x\) 种食材的出现状态了。

同时,可能存在当前的一个状态 \(s\),将 \(s\) 与第 \(i\) 个采集点结合时出现了背包装不下,单删掉 \(s\) 中的几个 \(1\) 后能够装下且更优。这启示我们,对于一个 \(s\) 实际上是可能转移到其一个子集会更优。既然都能转到子集了,那么在第 \(i\) 个采集点的时候,记 \(t_i\) 为这个采集点每个食材的出现状态,我们就完全可以用一个与 \(t_i\) 不交的状态 \(s\) 来转移。

我们对于当前能够达到的所有状态 \(s\) 去转移 \(s'\)。如果 \(s'\) 已经被转移过了,那显然是没有必要再转移一次的。那么我们就能保证每个状态最多被转移 \(1\) 次。同时,因为 \(s\) 的所有子集也可以去转移,所以算上枚举子集的复杂度就是 \(O(3^x)\) 的。

这里给个小优化:因为 \(n\) 十分巨大,如果我们对于每个 \(t_i\) 都去枚举它能达到的状态 \(s'\),最坏是 \(O(2^xn)\) 的,但是根据上一自然段的分析,得知对于相同的 \(t_i\) 是没必要再去遍历一遍的,直接清空就行。具体操作的时候会发现,我们可能一个 \(|s'|+V_i >v\) 了,在这个采集点是无法转移的,而可能会有后面的某个转移点可以转移,但是我们给它清空了。为了避免这种情况,我们可以存一下 \(|s'|\)。

【Sub3】

考虑到,对于一个状态 \(s'\),如果它可以通过 \(t_i\) 和 \(s\) 得到,当且仅当 \(s'\) 是 \(t_i \cap s\) 的子集。根据 Sub2 分析的第二个自然段,可以进一步得到:当状态 \(s'\) 能被转移到时,需要满足 \(s'\) 的所有子集都能被转移到。那么我们拿一个 set 来记录所有合法的状态,如果一个状态可以得到,我们去推它的一个超集,动态插入所有从不合法变成合法的超集。那么之后任意时间,这个状态都没有用了,可以直接删掉。

现在考虑枚举超集。根据上述的条件,我们得知 \(s'\) 合法的前提是其子集都合法,那么我们枚举超集的时候就只需要枚举所有 \(|S|=|s'|+1\) 的 \(s'\) 的超集,只要 \(S\) 删掉任意一个 \(1\) 得到的集合都合法,那么它就合法了。为什么不需要枚举 \(|S|=|s'|+2\) 的超集?很显然,当 \(|S'|=|s'|+1\) 且 \(S'\) 是 \(S\) 的子集时,如果 \(S'\) 仍不合法,那么 \(S\) 显然不合法。如果 \(S'\) 合法,那么 \(S\) 将在枚举 \(S'\) 的超集时被枚举到。所以这样就是对的。

因为这样我们保证了对于任意时刻,不存在 set 中的两个状态 \(a,b\),有 \(a\) 是 \(b\) 的子集。所以 set 中最多 \(x\) 个状态。额,分析不来了。复杂度未知,应该不是很大。

代码

你可以自己写。

标签:collecting,状态,题解,超集,合法,枚举,子集,Wdoi,转移
From: https://www.cnblogs.com/harmisyz/p/18546903

相关文章

  • 【题解】CF1982
    A考虑两队的领先情况改变,那么一定有某一时刻两队的比分相等于是首先检查最开始的领先队伍,再检查现在的领先队伍,如果前后不同,则\(YES\),否则\(NO\)B注意到当\(x=1\),则会进入循环,手模一下发现\(ans=k\%(y-1)+1)\)现在的问题是:什么时候\(x=1\)?直接手动模拟即可,不难证明时......
  • Intellij IDEA如何设置中文版?安装中文汉化包插件?失败问题解决!
    前言大家好,我是小徐啊。IntellijIDEA默认是英文的操作界面,因为是外国人开发的嘛~对于英文好一点的同学来说,英文就英文吧,但对于英文比较差的同学,就还是希望能够汉化一下,变成熟悉的中文。今天小徐就来介绍下如何在IDEA中安装汉化插件,以及在这过程中,我遇到的奇怪问题,以及最后如何......
  • P8099 [USACO22JAN] Minimizing Haybales P 题解
    好题图论的难点在于建图~首先我们关注到如果两个草堆之间的差大于K,那么他们的位置就是固定的,就相当于给了一些限制,这就是很经典的连边然后拓扑排序。其实你是不是可以直接从小的向大的连边(我没试)然后再做排序。这一部分代码(粗略验证正确性,赶着写的,可能比较一言难尽)#include<bi......
  • 【考试题解】NOIP2024(欢乐)加赛3
    目录A.SakurakoandWater题目内容思路代码B.BinomialCoefficients,KindOf题目内容思路代码C.QED'sFavoritePermutation题目内容思路代码D.CardGame题目内容思路代码E.LongWaytobeNon-decreasing题目内容思路代码F.ManyGames题目内容思路代码A.SakurakoandW......
  • COCI19-20#6 Trener题解
    COCI19-20#6Trenerlink一道水题(我真是太弱了啊啊啊啊。众所周知,看到这个题立刻知道他是要选名字长度为$1$到$N$的,而我们知道他每一个名字,所以可以直接用字符哈希去做,因为他每一个名字的字符数是上一层名字的字符数加一,所以对于哈希每个字符串只需要跑三次,分别是自己的这......
  • 【题解】洛谷P11186: 三目运算
    不好玩!!!这是个树形结构,直接暴力模拟,但过不去,但是需要发现答案是个区间,我们对字符串处理时记录最大值最小值,然后到叶子节点时我们将此时的区间存起来,查询时直接二分查询这个数对于的区间就可以了。总结:不好玩!!!#include<bits/stdc++.h>usingnamespacestd;#definelllonglon......
  • 【题解】洛谷P1712: [NOI2016] 区间
    P1712[NOI2016]区间我对尺取法并不敏感,所以感觉有点难度,我们想到按照区间长度排序加入使得满足单调性,直到有一个区间的覆盖次数达到了m就可以计算了,而这个就是尺取法,单调性使得我们答案总是最优的。覆盖次数就可以用线段树做,而且数据范围很大需要离散化,计算答案时注意把答案带......
  • 题解:P11251 [GESP202409 八级] 美丽路径
    题目传送门题目大意给你一颗树,每个结点为黑色或白色。求一条路径,使得路径上距离为奇数的点颜色不同,距离为偶数的点颜色相同,输出这条路径最多能包含多少结点。思路讲解容易想到用树形动态规划搭配dfs解决。将结点1......
  • 2021年6月上海月赛T5题解(做基础123题时遇到的)
    平衡点内存限制: 256 Mb时间限制: 1000 ms题目描述给定一个由 n 个整数组成的数列a1​,a2​,⋯,an​,请为这个数列找到一个平衡点,使得平衡点左侧与右侧的力矩尽量接近。若平衡点为 ak​,则左侧力矩定义为数列中下标小于 k 的各个元素到 ak​ 的距离乘以这些元素......
  • 「AT_diverta2019_2_e」Balanced Piles 题解
    题意描述有一个长度为\(N(2\leN\le10^6)\)的数组,一开始所有元素均为\(0\)。设\(M\)为当前数组中的最大元素,\(m\)是当前数组中的最小元素,你可以执行若干次以下操作:选择一个大小为\(m\)的元素,把他变为\(x\),其中\(M\lex\leM+D\)且\(m<x\)。求有多少种操作方法......