JSOI2019 Round2
JSOI的题质量很高……
精准预测(2-SAT、拓扑排序、bitset)
不难发现两个条件都可以用经典的2-SAT连边方式连边,考虑如何加入时间的限制。对于第\(x\)个人在\(t\)时刻的状态是生/死建点\((x,0/1,t)\),连上边\((x , 0 , t) \rightarrow (x , 0 , t-1)\)和\((x,1,t) \rightarrow (x , 1 , t+1)\)然后用2-SAT方式连边,就可以加入时间限制了。
上面的点数实在是太多了,一种朴素的想法是把所有2-SAT边连接的点拿出来建图。这样总点数是\(4m\)的,在LOJ上可以跑过,但是在Luogu上过不去……
还有一种相对更优秀的建图:对于2-SAT中的边\((x,y)\),如果\(y\)在2-SAT边中没有出边,那么将\(x\)连向\(y\)的后继和将\(x\)连向\(y\)是等价的。所以我们可以只拿出所有2-SAT边的出点和所有\((x,0/1,T+1)\),这样总点数就是\(2n+2m\)的。
不难发现我们连出来的图是一个拓扑图(生状态之间是一个拓扑图、死状态之间是一个拓扑图、跨越生死的边均是生连向死),所以我们的问题变成了对于每一个\((x,0,T+1)\)求出它能够到达的所有\((y,1,T+1)\)的状态数。在反图上拓扑排序+bitset。bitset开不下空间,于是分批做拓扑排序即可,复杂度不变。
注意可能存在一个人生连向死的情况,这个要特殊判断一下。
如果过不去开O3试一下……
神经网络(树形DP、容斥、生成函数)
这似乎是某道模拟赛题……
题目等价于:每一次可以在一棵树上选一条链(链上的点和之前经过的点无交),然后再在其他任意一棵树上选,问选到所有点的方案数
把这道题分为两个部分:将一棵树分为若干不相交的链、将这些链安排顺序使得不存在两条相邻的链来自同一棵树。
因为第二部分的方案数只和第一部分中每棵树划分出的链的条数有关,所以要求对于每一个\(j\),将当前树划分为\(j\)条链的方案数。不难想到一个树形DP:设\(f_{i,j,0/1/2}\)表示\(i\)及其子树中共有\(j\)条链,\(i\)点向儿子连出\(0/1/2\)条边的方案总数,转移考虑儿子和当前点的链是否合并。
值得注意的是:\(1\)个点也是一条链;对于长度\(>1\)的链,它对答案的贡献为\(2\),因为对于链的两个端点\(AB\),可以\(A\)进\(B\)出,也可以\(B\)进\(A\)出,在DP的时候需要乘上这个系数。
然后考虑第二部分。设第一部分求出来的答案为\(f_{i,j}\)表示将第\(i\)棵树分成\(j\)段的方案数\(\times j!\),因为链有序。接下来只需要考虑相邻链不来自同一棵树的方案。
先考虑序列上的问题,我们选择指数型生成函数求解。假设将第\(i\)棵树划分成\(k\)条链,那么在序列上会有\(k-1\)个空。容斥有多少个空在序列合并后不存在,不难得到这一项的值为\(f_{i,k} \sum\limits_{j=1}^k (-1)^{(k-j)} \binom{k-1}{j-1} \frac{x^j}{j!}\),那么这一棵树的生成函数就是\(\sum\limits_{k=1}^{k_i} f_{i,k} \sum\limits_{j=1}^k (-1)^{(k-j)} \binom{k-1}{j-1} \frac{x^j}{j!}\)
然后考虑环上。我们选出一棵树作为基准树,即断环成链之后,序列起始的一条链一定来自这棵树。那么其他树的生成函数不变,这棵树由于第一条链的位置确定,所以生成函数变为\(\sum\limits_{k=1}^{k_i} \frac{f_{i,k}}{k} \sum\limits_{j=1}^k (-1)^{(k-j)} \binom{k-1}{j-1} \frac{x^{j-1}}{(j-1)!}\),在\(f_{i,k}\)处除\(k\)的原因是将\(i\)树划分为\(k\)条链后这\(k\)条链都可以作为序列的起始位置。
还有一个限制是基准树的第一条链和最后一条链之间不能相接。所以基准树的生成函数还需要减掉\(\sum\limits_{k=1}^{k_i} \frac{f_{i,k}}{k} \sum\limits_{j=1}^k (-1)^{(k-j)} \binom{k-1}{j-1} \frac{x^{j-2}}{(j-2)!}\)。
最后暴力把这些函数卷积就可以得到答案。复杂度\(O(n^2)\)。
节日庆典(最小表示法、Z-algorithm)
我们要求每一个前缀的最小表示法,然后这道题就跟最小表示法没什么关系了。我们使用增量法求解,也就是每一次加入一个字符,然后在新的串上快速求解。
对于当前正在考虑的前缀\(s[1,l]\)的两个后缀\(i,j(i < j \leq l)\),若\(LCP(suf_i , suf_j) < l - j + 1\),那么后缀较大的那个位置不可能作为最小表示法的位置;如果\(LCP(suf_i , suf_j) \geq l - j + 1\),那么两个位置都有可能作为最小表示法的位置。我们维护集合\(S\)满足\(\forall a,b \in S , a < b , LCP(suf_a , suf_b) \geq l - b + 1\),就可以将答案锁定在\(S\)内。但是\(S\)的元素个数可能仍然很多,所以仍需优化。
考虑对于\(S\)中的两个数\(a,b\)满足\(l-b+1 < l-a+1 < 2(l-b+1)\)。由于\(s[b,l]\)是\(s[a,l]\)的前缀、是\(s[a,l]\)的后缀,也就是\(s[a,l]\)的长度\(> \frac{l-a+1}{2}\)的border。这意味着\(s[a,l]\)有一个长度为\(b-a\)的周期,设这个周期串为\(T=s[a,b-1]\)。这同时意味着\(s[a,l]\)有一个比\(l-b+1\)更短的border,记作\(s[c,l]\),不难发现\(c\)的一个可行值为\(2b-a\)。
因为串循环相当于在当前串的末尾插入当前串开头对应的字符,所以考虑在\(s[a,l],s[b,l],s[c,l]\)之后加入字符会得到怎样的解。如果加入的字符\(x = T[0]\),令\(T = T[1,l] + T[0]\),继续往后做;如果\(x < T[0]\),则\(s[c,l]+x < s[b,l]+x < s[a,l] + x\),选择\(c\)更优;如果\(x > T[0]\),则\(s[c,l]+x > s[b,l]+x > s[a,l] + x\),选择\(a\)更优;如果匹配到最后都没有匹配出三者的大小关系,因为\(a<b<c\),所以选择\(a\)更优。这意味着\(b\)无论如何不可能最优,可以直接把\(b\)删掉。
按照上面的叙述操作之后,\(\forall a,b \in S , a<b \rightarrow l - a + 1 \geq 2(l - b + 1)\),那么\(S\)的元素个数只有\(O(logn)\)个。而我们可以在增量的时候方便地维护集合\(S\)。
接下来考虑如何通过\(S\)求出答案。我们需要做的就是对于两个位置\(a,b(a<b \leq l)\)求出两种循环表示的串的字典序大小。从\(a\)开始的循环串分为\(s[a,l]\)和\(s[1,a-1]\),从\(b\)开始的循环串分为了\(s[b,l]\)和\(s[1,b-1]\),而由\(S\)的定义可知\(s[a,a+l-b] = s[b,l]\),所以我们只需比较\(s[a+l-b+1,l]\)与\(s[1,b-a]\)之间的关系、\(s[1,a-1]\)与\(s[b-a+1,b-1]\)之间的关系,也就是求出\(LCP(suf_1,suf_{a+l-b+1})\)和\(LCP(suf_1,suf_{b-a+1})\)。
注意到上面的LCP的计算都和原串有关,所以可以在\(O(n)\)时间内用Z-algorithm求出每一个后缀和原串的LCP,就可以快速比较两个位置。
复杂度是不满的\(O(nlogn)\)。
JSOI2019 Round2的更多相关文章
- JSOI2019 Round2 极限生还
江苏省省队一共13个名额,去掉女生名额, 按1/3校内限制,我们南外只有4个名额, 在noip爆炸(占比35%),省选一轮爆炸(占比40%),(此时蒟蒻在校内排不进前10...) 总算在省选二轮(占比 ...
- 【ContestHunter】【弱省胡策】【Round2】
官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...
- Loj #3102. 「JSOI2019」神经网络
Loj #3102. 「JSOI2019」神经网络 题目背景 火星探险队发现,火星人的思维方式与人类非常不同,是因为他们拥有与人类很不一样的神经网络结构.为了更好地理解火星人的行为模式,JYY 对小镇 ...
- 【LOJ】#3103. 「JSOI2019」节日庆典
LOJ#3103. 「JSOI2019」节日庆典 能当最小位置的值一定是一个最小后缀,而有用的最小后缀不超过\(\log n\)个 为什么不超过\(\log n\)个,看了一下zsy的博客.. 假如\ ...
- 【LOJ】#3102. 「JSOI2019」神经网络
LOJ#3102. 「JSOI2019」神经网络 首先我们容易发现就是把树拆成若干条链,然后要求这些链排在一个环上,同一棵树的链不相邻 把树拆成链可以用一个简单(但是需要复杂的分类讨论)的树背包实现 ...
- 【LOJ】#3101. 「JSOI2019」精准预测
LOJ#3101. 「JSOI2019」精准预测 设0是生,1是死,按2-sat连边那么第一种情况是\((t,x,1) \rightarrow (t + 1,y,1)\),\((t + 1,y, 0) ...
- [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)
[LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...
- 【JSOI2019】精准预测(2-SAT & bitset)
Description 现有一台预测机,可以预测当前 \(n\) 个人在 \(T\) 个时刻内的生死关系.关系有两种: \(\texttt{0 t x y}\):如果 \(t\) 时刻 \(x\) 死 ...
- [JSOI2019]节日庆典 做题心得
[JSOI2019]节日庆典 做题心得 一个性质有趣的字符串题 这要是在考场上我肯定做不出来吧 一开始还以为要 SAM 什么的暴力搞,没想到只用到了 \(Z\) 函数 -- 也是我生疏了罢 (学了啥忘 ...
随机推荐
- mysql 根据发音查找内容
当前表 mysql> select * from table1; +----------+------------+-----+ | name_new | transactor | pid | ...
- Serlvet开发
javaweb学习总结(五)——Servlet开发(一) 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口 ...
- PHP 之循环创建文件夹
/** * 循环创建文件夹 * @param string $dir 需要创建的文件夹路径 * @param integer $mode 文件夹权限 * @return bool 返回创建是否成功 * ...
- Kubernetes kubectl 命令概述
kubectl用于运行Kubernetes集群命令的管理工具. 语法 kubectl [command] [TYPE] [NAME] [flags] command:指定要在一个或多个资源执行的操作 ...
- iOS9 TableView和ScrollView滚动不响应问题
今天开始适配iOS9,发现在有UITableView或是ScrollView的界面滚动不灵敏有些卡顿,研究了下是因为tableview的cell里有可以相应点击事件的Button,当我点击到Butto ...
- shell中$(( ))、$( )、``与${ }的区别
转 :shell $(( )).$( ).``与${ }的区别 $( )与` `(反引号)命令替换 在bash中,$( )与` `(反引号)都是用来作命令替换的.命令替换与变量替换差不多,都是用来重组 ...
- 第09组 Beta冲刺(2/4)
队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...
- 自己搭建gitlab服务,组员不能上传代码
原因是因为 没有拉分支 直接在master 上开撸代码 ,master 分支 默认是受保护的,具体操作如下
- plupload如何限制上传文件数量,限制只能上传单个文件
1 完整代码 $(function() { $("#uploader").pluploadQueue({ runtimes : 'html5,gears,flash,silverl ...
- Post Setting Proxy 设置 代理
postman的代理使用篇(四) - codingstudy - SegmentFault 思否https://segmentfault.com/a/1190000012024844 postman ...