$HNOI\ 2010$ 解题报告
HNOI 2010 解题报告
0. HNOI2010 AC代码包下载地址
注:
戳上面的标题中的'地址' 下载 代码包,
戳下面每一题的文件名 可进入 题目链接。
每一题 对应代码的文件名 我在 每一题题解的标题旁 备注了。
提醒:请不要直接 \(Copy\) 我的代码,代码仅供用于题目理解与对拍。
1. [HNOI2010]弹飞绵羊\(\ \)(Sheep.cpp)
比较简单的一题。解法有\(INF\)种,这里给两种:
( 1 ) \(LCT\)维护链长,对边界外(\(>n\))开一虚点\(S\),每次查询即为\(x\)到\(S\)的路径长。
( 2 ) 分块,把序列分成\(\sqrt{n}\)块,对于每个点维护跳出所属块需要多少次,修改与查询都是\(O(\sqrt{n})\)的。
2. [HNOI2010]BUS 公交线路\(\ \)(Bus.cpp)
原题中,一辆公交车经过的相邻两个站台间距离不得超过\(P \ km\)
本题关键就在这里,这意味着在任意区间长度为\(P\)的区间中,每个数字至少出现一次。
然后\(DP\),\(f[i][S]\)表示做到第\(i\)个车站,\([i,i+P-1]\)区间内的车站情况为\(S\)的方案数。
其中\(S\)是记录每一个车站是否被选择了(\(1\)表示已选择,\(0\)表示未选择)。
每次强制\(S\)中\(1\)的个数为\(K\),转移时强制移动\(S\)中的第一辆车(保证第一个位置为\(1\))。
显然每次转移都是一模一样的,用矩阵快速幂优化一下就可以跑过\(n\leq 10^9\)的数据点。
3. [HNOI2010]CHORUS 合唱队\(\ \)(Chorus.cpp)
水题,放在普及组第\(3\)题还差不多。
\(f[l][r][0/1]\)表示放置完\([l,r]\)的人,本次放的是\(0/1\)(左端/右端)的方案数。
转移就是一般的区间\(DP\)的转移,自己手玩一下即可,也非常简单。
4. [HNOI2010]CITY 城市建设\(\ \)(City.cpp)
难度比较大......
做法是分治,
对于一段修改序列,修改操作涉及的边 我们没法处理,递归解决。
考虑当前所有 不涉及修改的边 ,其实每次我们可以直接排除一些边对后面的影响:
( 1 ) \(Contraction\):
把修改边的权值设为\(-INF\),跑一遍\(Kruskal\),
此时出现在最小生成树中的非 \(-INF\)边在后面必须要选。称其为必选边。
( 2 ) \(Reduction\):
把修改边的权值设为\(INF\),跑一遍\(Kruskal\),
此时出现在最小生成树中的非\(INF\)边在后面一定不会选。称其为无用边。
那么二分处理修改序列。
在二分的每一层,排除此时的必选边与无用边,然后得到一个新的边集,递归处理。
边界条件是只剩下一个修改,这时修改对应边的权值,然后跑\(Kruskal\)即可得到答案。
每一次删边都大幅度的减小了图的规模,复杂度暂时不会证,就\(O(AC)\)吧。
5. [HNOI2010]MATRIX 矩阵\(\ \) (Matrix.cpp)
个人认为是HNOI2010中出的最棒的一题。
显然确定了矩阵的第一行第一列这个矩阵就可以确定下来了。
直接暴搜这个可以\(0ms\)跑过一个点(虽然直接全局暴搜也可以\(24ms\)跑过这个点)。
下面看正解,我们先构造一个不管值域范围的和合法的矩阵:
\[c[i][j] = sum[i][j]-c[i-1][j-1]-c[i][j-1]-c[i-1][j]\]
特别的,第一行第一列的\(c = 0\)。 假设\(mp[i][j]\)表示最终确定的矩阵。
那么显然有:
\(mp[i][j] = mp[0][0]*f(i+j+1)+mp[0][j]*f(i)+mp[i][0]*f(j)+c[i][j]\)
其中\(f(x) = (x\%2==1) ? (-1) : (1)\)
所以枚举第一行的情况,利用上面的关系是检查第一列是否有解即可。
具体的检验法就是把\(mp[i][j]=\)\(0\)或\(p-1\)带入上面的式子中,解出\(mp[0][j]\)。
得到的两个值即为此时的限制\(Dn_{now}\)与\(Up_{now}\),
然后\(Dn = max(Dn,Dn_{now})\ ;\ Up = min(Up,Up_{now}) ;\),判一下空集即可。
6. [HNOI2010]PLANAR\(\ \)(Planar.cpp)
改善心情的一道题 ( HNOI2010题目难度两极分化真的很严重啊)。
首先平面图定理:\(边数 \leq 点数*3+6\),把边数降到\(O(n)\)级。
显然直接把给你的哈密顿路径拉成一个环。
那么除了环上的边,剩下的边只有可能在环的里面或者环的外面。
网上一堆人嚷嚷 \(2-SAT\) 其实完全没必要。
判一下线交,类似关押罪犯那题一样做一遍 补集并查集 即可。
7. [HNOI2010]STONE 取石头游戏\(\ \)(Stone.cpp)
话说每年省选都一定会有一道毒瘤题。 这题我感觉考场想出来的概率为\(\% eps\)......
题目的意思是:给两个栈和一些双端队列,问先后手最优方案下的取值。
先看栈,栈的取值其实是固定了的。
对于栈\([a_e a_{e-1} ....a_2 a_1>\),如果有\(a_e > a_{e-1}\),
那么当前的先手(当前取的人)去取\(a_{e-1}\)肯定是不优的,因为对手立刻可以取掉\(a_{e}\)。
我们把这种情况放到最后,按照奇偶顺序去取。
然后是双端队列,双端队列的处理则比较巧妙:
对于双端队列\(<a_1 a_2....a_{e-1}a_e>\),如果存在\(a_{i-1} < a_i > a_{i+1}\)这样的上凸关系,
那么此时的先手与后手的收益差其实是确定了的,
所以我们把收益替换为:\(a_{new} = a_{i-1} + a_{i+1} - a_i\)。
由于这样合并后,先后手收益关系并没有变,
所以这样不断变化,序列每个元素其实就变为了先后手收益差。
注意理解这里:这里的先后手收益差中的 先手是指 第一个取这个元素所代表的石子堆集合的人。
然后把元素从大到小排序,依次取,得到最终两者的数量差,解方程即可的到两人的最终石子数。
8. [HNOI2010]FSK 物品调度\(\ \)(Fsk.cpp)
此题又是强行二合一(另外一道蛇皮题是[SDOI2010]粟粟的书架)。
先解决比较简单的一问吧。 假设我们已经得到了\(pos_i\)数组,那么最少步数是多少?
这一问还是比较容易的。先把循环节都跑出来,把长度为1的丢掉,
设循环节的长度为\(L\) , 那么就两种情况:
( 1 )循环节中 有 \(0\)(空位),
那么直接循环\(L-1\)次把循环节上的每一个点归位即可,一共操作\(L-1\)次。
.
( 2 )循环节中 无 \(0\)(空位),
那么先把\(0\)拉进循环节,再循环\(L-1\)次,然后把\(0\)踢出去,一共操作\(L+1\)次。
然后就是\(pos_i\)数组的求解。我们要给每一个点分配一个位置,
看一下公式:\(pos_i=(c_i+d*x_i+y_i)\ mod\ n\)
如果\(y_i\)固定,那么\(pos_i\)的取值会构成一个环。
所以我们从小到达枚举\(y_i\),检查\(y_i\)对应的环中是否还有\(pos\)可以取。
如果没有可取的,\(y_i++\), 到下一个环中继续找,直到找到了一个合法的取值为止。
显然这个东西直接用 并查集或者链表 维护就行了。
9. HNOI2010 考察知识点汇总
( 1 )弹飞绵羊(Sheep): \(LCT\) 、 分块
( 2 )公交线路(Bus): 状压\(DP\)、矩阵优化
( 3 )合唱队(Chorus): 区间\(DP\)
( 4 )城市建设(City): 二分、最小生成树
( 5 )矩阵(Matrix): 搜索与剪枝、数学推导
( 6 )平面图(Planar): 平面图定理、并查集
( 7 )取石子游戏(Stone): 逻辑推导,贪心
( 8 )物品调度(Fsk): 并查集、置换群
随机推荐
- 【JavaWeb】c3p0连接池与MySQL
正文之前 在之前的文章讲到了传统的JDBC连接MySQL的方式,但是这样的方式在进行多个连接时,就显得效率低下,明显不如连接池的效率,所以我们这次来讲解一下JDBC连接池之一:c3p0 正文 1. 准 ...
- SSE图像算法优化系列十七:一些图像处理中常用小过程的SSE实现。
在做图像处理的SSE优化时,也会经常遇到一些小的过程.数值优化等代码,本文分享一些个人收藏或实现的代码片段给大家. 一.快速求对数运算 对数运算在图像处理中也是个经常会遇到的过程,特备是在一些数据压缩 ...
- centos7安装部署gitlab服务器
[gitlab需要内存至少4GB] 我这里使用的是centos 7 64bit,我试过centos 6也是可以的! 1. 安装依赖软件 yum -y install policycoreutils ...
- linux shell 执行远程命令
我在本地的shell脚本中,想要直接执行远程服务器的一个shell脚本: ssh -l root 192.168.1.1 "/data/t.sh" 记得提前给远程服务器的 /dat ...
- MySQL创建用户与授权
一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户 ...
- 学习资料分享:Python能做什么?
最近一直忙着研究学习Python,很久没更新博客了,整理了一些Python学习资料,和大家分享一下!每天更新一篇~ 一.Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一 ...
- js中checkbox的全选和反选的实现
<head> <meta charset="utf-8"/> <script type="text/javascript"> ...
- 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...
- dfs练习
不给提示,练习. 题意: 蒜头的数学实在是太差了,于是老师把他关到小黑屋让他闭门修炼.老师跟他一张纸,上面一排写着1, 2, 3...N这N个数,中间用空白分隔.老师让他在空白处填上加号或者减号.他让 ...
- @EnableAsync @Asnc 以及4种拒绝策略
根据不同的场景,可以选择不同的拒绝策略,如果任务非常重要,线程池队列满了,可以交由调用者线程同步处理. 如果是一些不太重要日志,可以直接丢弃掉. 如果一些可以丢弃,但是又需要知道被丢弃了,可以使用Th ...