【2018.12.10】NOI模拟赛3
大概就是全场就我写不过 $FFT$ 系列吧……自闭
T1
奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-|||
而且这跟我口胡的自创模拟题 $set1$ 的 $T3$ 差不多啊……我之前口胡那题甚至还改简单了点(因为忘了 $FFT$ 可以套分治优化)。
注意,分治 + $FFT$ ≠ 分治$FFT$ !!!
分治 + $FFT$ 是用分治来卷一堆背包,并且这些背包的总大小是祖传级别的!!!
分治$FFT$ 跟 $FFT$ 求的式子都不一样。
基础知识:n点无根树,问包含恰好k个点的连通子图的最大权,点上有权,k∈[1,n]。
$f(x,k)$ 以 $x$ 为根子树包含 $k$ 个点的最大权。
这就是以前说过的那个假 $O(n^3)$ 复杂度的 $dp$,不说了。
这题其实就是给了一堆环,然后问随机放 $k$ 个人,使每个环上至少有 $1$ 个人的概率。
像这种概率问题,我们先把它转化成方案数,因为 概率 $=$ 满足要求的方案数 $/$ 总方案数。
一提到方案数,我们就想到这个可以用传统的背包做……
就是对于每个环,预处理出在这个环上分别放 $1$ 到 $size$ 个人的方案数。
可以证明这样全局有 $n$ 个方案数。
然后就要用一种类似于合并背包的方法,把这堆总大小为 $n$ 的背包合并成一个。
啥叫合并背包?
考虑这么一个问题:有两个背包各自维护一个集合,背包的第 $i$ 位表示 自己的集合中有多少个值为 $i$ 的数。
然后让你求 两集合的所有数两两配对相加后,得到的数的集合。
假设一个集合中有 $x$ 个值为 $i$ 的数,另一个集合中有 $y$ 个值为 $j$ 的数,根据题意(两两配对相加)和乘法原理,可知新集合会有 $x\times y$ 个值为 $i+j$ 的数。
由于需要用两重循环枚举两个背包中配对的数,所以时间复杂度是 $O(n^2)$。
这就是合并背包。
但这样合并的时间显然升天了!怎么优化?
其实合并背包有个定性优化,我们只需要观察合并背包的式子就发现了——
$$C_{i+j}=\sum_{i=1}^{size(A)} \sum_{j=1}^{size(B)} A_i\times B_j$$
这就是裸的 $FFT$ 式子啊!此时合并两个背包的时间复杂度只有 $O(n\times log(n))$ 了(有一堆常数)。
但是这题有一堆背包,那时间复杂度还要再乘个玄学值,可能会超时。
所以考虑快速合并大量背包的做法。这里有两种,一种是 分治+$FFT$,一种是 按秩合并(即每次合并两个大小最小的背包)。
分治+$FFT$ 就是分治合并一堆背包,时间复杂度是 $O(n\times log^2(n))$ 带巨大常数(因为分治的每层中,合并一些总长为 $n$ 的背包的总时间复杂度略高于 $O(n\times log(n))$);
按秩合并(启发式合并)类似于哈夫曼编码的原理,这种做法的时间复杂度其实比较玄学,但实测跟 分治+$FFT$ 的效率差不多。
由于这题需要取模,所以把 $FFT$ 全改成 $NTT$。
T2
防 $AK$ 题
$30pts$ 轮廓线 $dp$ 裸题。
$50pts$ 改进一下,一行一行转,那么枚举相邻两行的所有状态,预处理一个 $(2^m)^2$ 大小的转移矩阵。然后矩阵快速幂转移。时间复杂度 $O((2^m)^3\times log(n))$。
$65pts$ 发现 $log$ 直接爆出去了,所以二进制快速幂改成十进制快速幂。
$0$ 到 $9$ 分成 $2$ 的若干次方
原理……像循环展开吧。
$80pts$ 把那些没用的转移去掉。
具体怎么去掉呢?我们发现每次转移既然都是对应一个固定的转移矩阵,也就是说每相邻两层的转移 都是上一层的所有 $m$ 种状态点 向下一层的所有 $m$ 种状态点连有向边,这样最多有 $2^{2m}$ 条边。这是个有环图,也就是说转移若干层(最多 $256$ 层)后,就会回到原来的一种状态。这样我们就发现有些情况的入度是 $0$,即没有任何状态能转移到它,那这些状态就是没用的,在预处理转移矩阵的时候就不放它们,对剩下的有用状态照常处理。实测 $m=8$ 时只有 $71$ 个有用状态。
T3
tag:树状数组+链上二分。
暴力的做法就是取出查询的链,然后扫两遍,求带权中位点(就是找一个位置,使两边的权值差的绝对值最小)。时间复杂度 $O(q\times n)$。
这种题显然需要数据结构维护(虽然我不是很会在树上套数据结构)。
我们可以拆出 $3$ 个部分:
1. 单点修改
2. 找出一条链上的带权中位点
3. 求链上所有点到其带权中位点的带权距离和(附加的那一堆深度……明显是等差数列,等差数列)
$2$ 操作是决策操作,所以首先考虑定死的 $1,3$ 操作能否同时完成。
有一种可以维护树上链权和的数据结构,叫树状数组。
首先单点修改可以看成减一个数再加一个数,也就是单点加。开个数组记一下每个位置上的数即可。
为了记链权和,我们在单点加时 给以修改点为根的子树的所有点都加上同样的加数。由于子树是一段连续的 $dfs$ 序区间,所以子树加的操作 用以 $dfs$ 序为下标的树状数组 随便维护就行了。
然后假设一条链的两端点为 $x,y$,$lca$ 为 $x$($y$ 同理),如图
我们定义一个点的权值为从根节点到这个点的路径上所有点的 数值 $\times$ 深度 的和,则这段链的权值和为 $T(y)-T(fa(x))$。
其中 $fa(i)$ 为点 $i$ 的父亲,$T(i)$ 为以点 $i$ 的权值,深度是指在整棵树中的深度。
其实就是普通前缀和的思想。一个点到根的路径的权值和 只会受到它所有祖先的影响,而你在更改祖先时就已经把包括这个点在内的所有子孙都更新了,所以查询的时候直接前缀相减就行了。
同时,我们还解决了区间统计时,深度的递增所带来的影响。
那么对于 求链上所有点到其带权中位点的带权距离和 这个问题,我们就可以把一条两端为点 $x,y$,$lca$ 为 $L$ 的链拆成 $3$ 条像上面一样的不拐弯的链:
假设蓝点是中位点,其编号为 $k$,则绿色链很好处理,其贡献为 $[T(x)-T(fa(k))]-sum(k,x)\times depth(k)$,其中 $sum(k,x)$ 为 从点 $k$ 到点 $x$ 的所有点上的数的和;
蓝色链也很好处理,其贡献为 $[T(y)-T(fa(L))]-sum(L,y)\times [depth(k)-depth(L)]$;
紫色链就麻烦点,因为这部分的深度是倒过来计算的,所以贡献为 $sum(L,k)\times depth(k) - [T(k)-T(fa(L))]$。
那最后的问题就是……查询链上所有点上的数的和?
再维护一个树状数组,像维护链上的权值和一样做就行了。
然后考虑能否在此基础上再支持 $2$ 操作。
首先我们得知道找带权中位点的本质:找一个点,使得两侧的点权和的差最小(这里的差肯定要取绝对值)。
有个很暴力的做法,就是我们发现 在移动假想中位点的时候 两侧的点权和的差值变化 是个二次函数图像。
所以我们可以直接链上三分,找出差值的最小值所在处。这样的话就得快速移动假想中位点,需要用倍增或树剖。总时间复杂度是 $O(n\times log^3(n))$ 的,带上大常数,卡不过……
先不管树剖,如果我们用的是倍增,我们会发现三分和倍增移动其实是同一类东西,两者可以合并。
也就是说,可以从底部倍增往上跳,然后找到第一个两侧差值变号的位置,暴力判断它和相邻的点谁绝对差值更小就行了。
考虑到链会在 $lca$ 处打折,把链以 $lca$ 为界拆成两半,分别找这个位置,然后再取最优者就行了(其实很显然,至少有一边找到的位置是 $lca$)。
这个做法叫链上二分,但实际上只用了倍增。总时间复杂度 $O(n\times log^2(n))$。
【2018.12.10】NOI模拟赛3的更多相关文章
- EZ 2018 06 10 NOIP2018 模拟赛(十八)
好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...
- [10.18模拟赛] 序列 (DP)
[10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...
- 2018.10.17NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...
- EZ 2018 06 17 NOIP2018 模拟赛(十九)
这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...
- 6.28 NOI模拟赛 好题 状压dp 随机化
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- 【2018.12.17】NOI模拟赛4
题目 WZJ题解 T1 T2 T3 后缀自动机+($parents$ 树)树链剖分 发现有大量子串需要考虑,考虑摁死子串的一端. 首先,这题显然是一道离线题,因为所有的询问都是 $1$ 到 某个数,也 ...
- 2018.10.23NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 50 + (10 \sim 50)\) 实际得分:\(100 + 10 + 50\) 这可能是我打的最懵逼的一场考试没有之一.. T1两个小时才做出来也是醉了. T ...
- 2018.08.10【省赛&提高A组模拟】比赛总结
题解 这次题目可真是太难了! 糟糕的运气使我AK的步伐寸步难行(士气严重下降). T1 这题还是比较水的(尽管我比赛时只拿了50分) 一些大佬们说:这题只是一道简单的暴力题,枚举l+二分r 就可以了. ...
随机推荐
- Azure School女神相邀,把每分钟都过的更充实
也许你不姓「牛」,但是你技术牛啊 所以,请容我叫你一声「牛郎」 (讲真,只是因为你技术牛,不是其他啥原因哈) 平时忙到昏天黑地,一心一意为技术的你 注意看一下日历,因为: !!!七夕节(8月28日)到 ...
- vue+element ui项目总结点(六)table编辑当前行、删除当前行、新增、合计操作
具体属性方法参考官方网站:http://element-cn.eleme.io/#/zh-CN/component/installation <template> <div clas ...
- codevs 3096 流输入练习——寻找Sb.VI
时间限制: 1 s 空间限制: 16000 KB 题目等级 : 白银 Silver 题目描述 Description 已知某开放授权人员名叫Serb,由于经常修改各种数据,因此开发人员们都喊他SB ...
- springmvc+maven搭建web项目
1.创建一个maven project 为spring1 2.进行项目的配置:默认的java 1.5 在properties中选择project facts项目进行配置,反选web之后修改java环境 ...
- DP一直是自己的弱势 开始练滚动数组——HDOJ4502
http://acm.hdu.edu.cn/showproblem.php?pid=4502//题目链接 思路 : dp[i]表示 到第i天能获得的最大工资 依次更新 #include<cst ...
- win10搭建Java环境
一.下载地址 jdk和jre官方网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 根据你的系统选择你需要 ...
- 【转】数据库SQL的一些总结
http://www.cnblogs.com/yank/category/104903.html
- 【page-monitor 前端自动化 上篇】初步调研
转载文章:来源(靠谱崔小拽) 前端自动化测试主要在于:变化快,不稳定,兼容性复杂:故而,想通过较低的成本维护较为通用的自动化case比较困难.本文旨在通过page-monitor获取和分析dom结构, ...
- NYOJ-1057-寻找最大数(三)
http://acm.nyist.net/JudgeOnline/problem.php?pid=1057 寻找最大数(三) 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描 ...
- 第2节 azkaban调度:17、azkaban的两个服务模式的安装
2.3.3.azkaban两个服务模式安装 1.确认所需软件: Azkaban Web服务安装包 azkaban-web-server-0.1.0-SNAPSHOT.tar.gz Azkaban执行服 ...