首页 > 其他分享 >NOI春季测试前模拟赛题解

NOI春季测试前模拟赛题解

时间:2023-07-17 23:23:00浏览次数:48  
标签:code NOI 题解 复杂度 mid 春季 dfs 纵坐标 DP

T312819 命题工作

直接容斥。

总方案 - 一题出现四次 - 一题出现三次 - 一题出现两次。

一题出现两次的情况略有不同,注意考虑周全。

复杂度 \(O(n)\)。

code

T312891 图上棋局

有技巧的博弈论。

如果当前点的所有出边均为先手必胜,那么当前点为先手必败。

否则先手必胜。

于是我们可以建一个反向图,初始状态都设为 \(0\),跑拓扑排序即可。

为什么不用记忆化呢?因为环的情况不好处理,而且卡时间。

复杂度 \(O(q(n+m))\)。

code

T312903 点对

简单构造题。

假设有一个包含 \(n\) 个节点的简单环,那么符合要求的点对为 \(\frac{n(n-1)}{2}\)。

所以我们考虑构造出一些环,相邻的环连一条边,容易证明一定能凑出 \(k\)。

复杂度 \(O(1)\)。

code

T312907 虫

简单树形 DP。

对于当前点 \(u\),找到其所有儿子 \(v\) 中最大和次大的链,拼在一起。

注意当前点为根和只有一个儿子的情况。

复杂度 \(O(n)\)。

code

T312820 信号干扰仪

每次找到距离最近的一对圆,加上他们相交的时间并删除。

反复操作直到没有圆。

复杂度 \(O(n^3)\)。

code

P1039 [NOIP2003 提高组] 侦探推理

大模拟。

枚举罪犯和日期,判断有多少人说谎。

复杂度 \(O(mp)\)。

code

T310430 树

F1:树上差分。

把路径上的边 \(+1\),覆盖 \(0\) 次、\(1\) 次、多次的情况分别讨论。

复杂度 \(O(n\log n)\)。

code

F2:类似 DP。

考虑每一条边覆盖几次,实际上只有三种情况。

所以对于当前节点 \(u\),我们考虑有几条路径跨越了 \(u\) 到 \(fa\) 的边。

仔细一想,我们发现可以从子树转移。

首先我们将树分为三个部分。

每个点维护起点在红色区域,终点在绿色区域且 dfs 序最小和次小的路径。

再维护起点在红色区域,终点在蓝色区域且 dfs 序最大和次大的路径。

这样就可以由子树传递上来,然后处理一下只保留四条特殊路径即可。

复杂度 \(O(n)\)。

code

P2593 [ZJOI2006]超级麻将

T225798 电阻电路

P7073 [CSP-J2020] 表达式

P3230 [HNOI2013] 比赛

T312843 排列

T313447 最小公倍数

T312821 花圃

T313449 珍珠项链

T313460 批改作业

T312916 连续子段和

T313666 平衡序列

T312914 编辑

T313555 拼板游戏

T315265 评测机

二分答案。

check 的时候用队列记录评测任务,然后从左到右贪心地评测即可。

如果超过时间 \(D\),或者最后队列不为空,返回 false

复杂度 \(O(n\log n)\)。

code

T315262 赛场

F1:决策单调性+分治优化 DP。

首先可以断环为链。

枚举起点 \(l\),定义 \(f_{i,j}\) 表示在 \([l,i]\) 中开 \(j\) 扇门的最小代价。

然后就有了单次操作 \(O(n^2m)\) 的 DP,即:

\[f_{i,j}=\min_{k=l}^{i}(f_{k-1,j-1}+sum_{k,i}) \]

其中 \(sum_{i,j}=\sum\limits_{t=i}^{j}a_t\cdot (t-i)\),可以预处理。

观察发现,如果 \(f_{i,j}\) 的最后一扇门在 \(w\),那么对于所有 \(k<j\),\(f_{k,j}\) 的最后一扇门在 \(w\) 左侧,反之同理。

于是可以枚举 \(l\) 和 \(j\),对于 \(f_{l,j}\) 到 \(f_{l+n-1,j}\) 分治处理。

具体可以定义 \(dfs(x,l,r,L,R)\) 表示当前有 \(x\) 扇门,\(f\) 第一维范围为 \([l,r]\),决策范围为 \([L,R]\)。每次计算出 \(mid=\frac{l+r}{2}\),暴力算出 \(f_{mid,x}\) 的最优决策点 \(w\),然后递归 \(dfs(x,l,mid-1,L,w)\) 和 \(dfs(x,mid+1,r,w,R)\)。

复杂度 \(O(mn^2\log n)\)。

code

F2:斜率优化DP。

待更。

T315264 公交线路

容易想到一条路径的两个端点必定为这棵无根树的叶子节点。

我们考虑 “剥洋葱”,每次找到最外层的叶子节点,答案加上 \(\min(cnt,2\cdot m)\),其中 \(cnt\) 为叶子节点的个数。

然后拓扑排序去掉最外层,直到把整棵树都去除。

至于证明,仔细想想就明白了。

复杂度 \(O(n)\)。

code

T315263 训练基地

考虑 \(40pts\) 的暴力。

以 \(x\) 为关键字从小到大排序,对于当前节点 \(u\),找到前面所有纵坐标小于 \(u\) 的纵坐标的点集的最长下降序列,直接从后往前找即可。

考虑分治优化。

假设当前区间为 \([l,r]\),计算出 \(mid=\frac{l+r}{2}\),递归处理 \([l,mid]\) 和 \([mid+1,r]\)。

然后将 \([l,r]\) 以纵坐标为关键字从小到大排序。

左边维护一个数组 \(vec_1\) 记录下降序列,右边维护一个数组 \(vec_2\) 记录上升序列。(本质上就是单调栈)

找到 \(vec_2\) 中倒数第二个元素的纵坐标 \(y\),并在 \(vec_1\) 中二分,找到有多少个点的纵坐标大于 \(y\) 即可。

复杂度 \(O(n\log^2n)\)。

code

标签:code,NOI,题解,复杂度,mid,春季,dfs,纵坐标,DP
From: https://www.cnblogs.com/HQJ2007/p/17561605.html

相关文章

  • 题解 P2137 Gty的妹子树
    神奇的分块。假如没有\(2\)操作,我们可以直接用主席树解决。我们考虑将询问分块,每遍历完一块就将这一块内出现的所有修改更新。如果在块内,就把当前块之前的所有修改暴力算,当然只有修改的节点在询问的节点的子树内才会发生。具体的来说,我们可以用分块维护dfs序,并将块内的元素......
  • 题解 P4183 [USACO18JAN] Cow at Large P
    带有小trick的点分治。建议先做完弱化版再看。假如奶牛在\(u\),那么所需的最少农夫数为\(\sum\limits_{v\inson(u)}[dis(u,v)\geg_v][dis(u,fa_v)<g_{fa_v}]\)。其中\(dis(u,v)\)为\(u,v\)在树上的距离,\(g_u\)为\(u\)到离它最近的出入口的距离(BFS预处理),\(fa_u\)......
  • 题解 P9415 下楼
    不难推理出当初始绳长为\(len\),需要下降的距离为\(d\),并且满足\(d\lelen<2d\)时,最优的环套法可以只损失\(2d-len\)长度的绳子,留下\(2(len-d)\)的绳子。当\(2d\lelen\)时存在一种不损耗绳长的方法可以下到下一根钢管,即把整根绳子系成一个环,到达下面再剪断。正文:线......
  • 题解 P9437『XYGOI round1』一棵树
    换根DP。本蒟蒻最初没想到换根,把自己写自闭了...定义\(f_u\)为子树\(u\)中的每个结点走到\(u\)的贡献和,\(l_u\)为大于\(a_u\)的最小的\(10\)的幂次方数,\(sum_u\)为\(\sum\limits_{v\inson(u)}{f_v}\)。转移方程为:\(f_u=l_u\cdot\sum\limits_{v\inson(u)}{f_v}+......
  • 决策单调性优化DP 学习笔记 & P4767 [IOI2000] 邮局 题解
    0.题面题目描述高速公路旁边有一些村庄。高速公路表示为整数轴,每个村庄的位置用单个整数坐标标识。没有两个在同样地方的村庄。两个位置之间的距离是其整数坐标差的绝对值。邮局将建在一些,但不一定是所有的村庄中。为了建立邮局,应选择他们建造的位置,使每个村庄与其最近的邮局......
  • 题解 P7215
    点分治。考虑当前的分治重心的城市被完全联通。这可以用队列接解决。每次放入一种城市,就把那些城镇的父亲加入队列,如果存在城镇不在当前分治重心的联通块内,那么说明必定存在另一个分治重心能算到它,直接退出即可。剩下的和模板没有任何区别。复杂度\(O(n\logn)\)。code:#in......
  • 题解 P6329
    点分树模板题。是个神奇的算法。点分树就是将分治重心按照层级连边,每个节点父亲的联通块都包含了当前节点的联通块,且高度为\(\logn\)。可以解决不考虑树的形态的多次询问带修改的问题。对于这道题,我们可以在点分树的每个节点上记录两棵树状数组,分别与当前节点距离为\(k\)的......
  • 题解 P3345
    点分树。本题的核心问题在于不好直接确定补给站的位置。但是仔细思考后我们发现,对于当前节点,如果存在一个儿子的答案比它优,那么补给站一定在那个儿子的子树中。增量为\(w\times(sum_u-2\cdotsum_v)\)。当\(v\)优于\(u\)时,\(2\cdotsum_v>sum_u\)。如果\(v_2\)也满足,则......
  • 题解 P5384
    这题有紫??对于询问节点\(u\),倍增地跳到它的\(k\)级祖先,求其子树内有多少深度为\(dep_u\)的节点。我们考虑把询问离线,再通过dfs序把树拍平,然后扫一遍直接求就行了。复杂度\(O(n\logn)\)。code:#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+5;inlin......
  • 题解 P3806
    点分治模板题。点分治适合处理大规模的树上路径信息问题暴力做法:dfs每个点\(u\),算出其子树内每个点到\(u\)的距离,统计经过\(u\)的所有路径,复杂度\(O(n^2)\)。容易发现,复杂度和子树大小有关。对于当前子树,我们可以求出其重心,计算经过重心的所有路径,删掉重心,递归每个联通......