zoukankan      html  css  js  c++  java
  • 基础省选题选做

    NOIP 活了,不知道要改成什么样,所以找些基础的省选题玩玩,就当是接触些思路,防止 NOIP 出现鬼畜现象。

    upd: 真就简单省选题都没联赛难了嗷!

    [HEOI2013]Eden 的新背包问题

    把物品二进制拆分,使用 cdq 分治来完成这个 dp 过程。

    cdq 的时候,按照 dp 右边 $ o$ 递归左边 $ o$ 清空 $ o$ dp 左边 $ o$  递归右边 的顺序执行。

    [GZOI2017]取石子游戏

    让 Alice 必败的条件是,Alice 无法在第一堆中取走若干使得剩下异或和为 $0$。

    枚举让 Alice 先选择哪一堆,用 $f_{i, j}$ 表示前 $i$ 堆,选出若干,异或和为 $j$ 的方案数。

    所有异或和 $ge$ Alice 先选择的那一堆的都可以计入答案。

    [HEOI2014]人人尽说江南好

    显然,最终的时候,前若干堆都是大小为 $m$ 的,最后一堆是大小为 $n mod m$ 的。

    总共的操作次数就是 $n - lceil frac n m ceil$,判断奇偶性。

    [JLOI2011]飞行路线

    分层图最短路,共 $k + 1$ 层,同层之间正常连边,相邻层视为使用了一次免费权利,连 $0$ 边。

    求最短路就可以了。

    [BJOI2018]求和

    预处理出 $k$ 分别为 $1 sim 50$ 时,某点到根路径上的深度的 $k$ 次方和。

    使用 LCA,树上前缀和求答案即可。

    [SHOI2015]自动刷题机

    分别二分上界(最后一个 $ge k$ 的)和下界(第一个 $le k$ 的),带入检验数据是否合理。

    [SDOI2016]排列计数

    考虑选哪 $m$ 个位置,方案是 $inom n m$,剩下的就是一个错排问题,答案是 $inom n m imes D_{n-m}$。

    预处理组合数和错排可以 $O(1)$ 回答每组询问。

    [CQOI2017]小Q的棋盘

    找出树上的最长链长度 $l$,分类讨论一下:

    如果 $m le l$,答案为 $m+1$(最长链走不完就一直走)。

    如果 $m > l$,答案为 $min(n, l+frac {m-(l-1)}{2})$(能走到头了就边往新的地方走边回溯,最终回到最长链上)。

     [BJOI2012]算不出的等式

    原式可以理解为,一个 $frac{p-1}{2} imes frac{q-1}{2}$ 的网格的主对角线被分成的两部分的整点数之和。

    因为 $p, q$ 都是质数,所以整点数之和就是 $frac{p-1}{2} imes frac{q-1}{2}$。

    需要特判的是 $p=q$ 的情况,答案为 $frac{p^2 - 1}{4}$。

    [TJOI2019]甲苯先生的字符串

    考虑 dp,用 $f_{i, j}$ 表示长度为 $i$,最后一个字母为 $j$ 的 $s2$ 串的个数。

    发现这个 dp 很容易矩阵快速幂优化,对于转移矩阵 $ ext{Trans}$,如果 $s1$ 中两个字母 $a$ 和 $b$ 是相邻的,那就把 $ ext{Trans}_{a, b}$ 赋值为 $0$,否则赋值为 $1$ 即可。

    [GXOI/GZOI2019]旅行者

    分别建出原图和反图,各跑一次 Dijkstra 进行最近关键点染色。

    枚举一条边,如果这条边的两个端点都在两次中被染色且颜色不同,则用这两个距离之和加上这条边本身的长度更新答案。

    当然这题有一种玄学算法就是,随便划分出两个点集,跑最短路。如果按照比特位为 $0/1$ 划分,跑 $log n$ 次的话可以确保算法正确,因为最近点对的编号总有一位不同。

     [TJOI2019]大中锋的游乐场

    又是分层图最短路。

    不妨定义一个饥饿度,按照饥饿度分层,把 $a_i = 1$ 看作饥饿度 $+1$,$a_i = 2$ 看作饥饿度 $-1$,那么在 $[-k, k]$ 层数中跑最短路即可。

    注意处理起点和终点的饥饿度变化。

    [HAOI2011]向量

    发现向量可以化简为 $(a, b), (a, -b), (b, a), (b, -a)$ 共 4 个。

    设 4 种向量分别用了 $k_1, k_2, k_3, k_4$ 次,则有 $x=(k_1+k_2)a+(k_3+k_4)b, y=(k_1-k_2)b+(k_3-k_4)a$。

    用 $r_1, r_2, r_3, r_4$ 分别还原代替掉 $k_1+k_2, k_3+k_4, k_1-k_2, k_3-k_4$,问题转化为,方程有解且 $r_1, r_3$ 同奇偶,$r_2, r_4$ 同奇偶。

    然后根据它们到底是奇数还是偶数分类讨论一下,根据裴蜀定理确定限制条件。

    令 $g = 2gcd(a, b)$,最终要求为 $(g|x land g|y)$ 或 $(g|(x+a) land g|(y+b))$ 或 $(g|(x+b) land g |(y+a))$ 或 $(g|(a+b+x) land g|(a+b+y))$。

    [GZOI2017]等差子序列

    用两个 bitset 分别维护前缀出现过的数和后缀出现过的数,枚举中间数,相应位置交起来看看存不存在就行了。

    当然上面的做法时间比较悬,更优秀的做法可以构造多项式通过 FFT 卷起来看看存不存在。

    [TJOI2018]数学计算

    对于操作建立一棵线段树,每个结点的初始值为 $1$。

    插入操作相当于把一个位置赋值为 $v$,删除操作相当于把一个位置赋值为 $1$。

    然后线段树维护全局乘积就好了。

    [JSOI2016]反质数序列

    观察到,质数一定是一个偶数和一个奇数的和($2$ 除外)。

    如果某个偶数和某个奇数都选会产生冲突,就连一条边,答案就是这张二分图的最大独立集,可以用 Dinic 来做。

    注意到,两个 $1$ 不能同时选,所以只保留一个 $1$ 在图中,剩下的 $1$ 直接删掉。

    [HNOI/AHOI2018]道路

    考虑逆推,用 $f_{u, i, j}$ 表示根到 $u$ 有 $i$ 条未翻修的公路和 $j$ 条未翻修的铁路,子树内的最小代价。

    转移的时候,叶子结点可以直接用 $c_u imes (a_u + i) imes (b_u+j)$ 表示,非叶子结点考虑翻修哪边就好了。

    转移方程:$f_{u, i, j} = min (f_{lson, i, j} + f_{rson, i, j+1}, f_{lson, i+1, j} + f_{rson, i, j})$。

    恶心的是这题卡空间,可以通过 vector 动态开数组,遇到用不上的就删除的方式卡过去,同一时刻最多开 $40$ 个数组。

    [SDOI2016]齿轮

    设 $1$ 号齿轮的转动情况为 $1$,则可以用分数表示出其他齿轮的转动情况。

    在 DFS 树上推出每个齿轮的转动情况后,用横叉边检验是否合法即可。

    为了避免浮点误差,可以使用对每个结点开一个数组,分别储存其每种质因子的次数。

    [FJOI2018]所罗门王的宝藏

    把每行每列都抽象为一个结点,构造一张 $n+m$ 个点的图。

    设第 $i$ 行共加上了 $x_i$,第 $i$ 列共减去了 $y_i$,则对于一个关键点 $(r, c, p)$,有 $x_r - y_c = p$。

    那么可以建立差分约束系统,判断负环即可。

    [TJOI2017]可乐

    巧妙的构造矩阵,进行快速幂转移。

    新建一个编号为 $0$ 的点,表示“自爆”。新的邻接矩阵中除了原来的边,每个点分别向自己和 $0$ 再连两条边。

    于是把这个矩阵 $t$ 次方后,$sumlimits_i ext{Matrix}_{1, i}$ 就是答案了。

    [GZOI2017]小z玩游戏

    对每种兴趣程度建一个点,$i$ 向 $kcdot i$ 连有向边,$w_i$ 向 $e_i$ 连有向边。

    跑一次 Tarjan 求出强连通分量,答案就是 $w_i$ 和 $e_i$ 属于同一个强连通分量的游戏个数。

    注意到倍数关系的连边是 $O(n log n)$ 级别的,且每次固定不变,所以可以提前连好这么一张图,$w_i$ 和 $e_i$ 之间的边在另一张每次都需要清空的图上连,实际处理的时候的图是这两张图的并集。

    [HEOI2016/TJOI2016]树

    可以离线逆序处理操作,使用并查集巧妙地维护。

    初始时记录每个点被打标记的次数,如果某个点 $u$ 本身被标记了,那么并查集里 $u$ 的父亲就是 $u$,否则就是树上的父亲。

    对于查询操作,直接查找并查集里 $num_i$ 的祖先就行了;对于修改操作,将 $num_i$ 被打标记的次数 $-1$,如果次数变成 $0$ 了就把并查集里它的父亲改成树上的父亲。

    [JSOI2016]无界单词

    考虑容斥 dp,第一问用 $f_i$ 表示长度为 $i$ 的没有 border 的字符串个数,转移时枚举 border 的长度,即:

    $$ f_i = 2^i - sum_{j=1}^{lfloor frac{i}{2} floor} f_j imes 2^{i-2j}$$ 

    第二问考虑逐位确定,先把该位填为 a,dp 一下看看有多少符合条件的字符串,如果 $<K$,那就把这一位填为 b,$K gets K - f_n$。

    第二轮的 dp 可以参考第一轮的思路,分类讨论一下,设当前确定了 $l$ 位,对于 $i le l$,可以 KMP 一遍标记存不存在 border;对于 $i > l$,设枚举的 border 长度为 $j$:

    • 如果 $j ge l$,则贡献为 $-f_j imes 2^{i-2j}$;
    • 如果 $i - l le j < l$,如果当前 border 符合条件则贡献为 $-f_j$,否则贡献为 $0$;
    • 如果 $j<i-l$,贡献为 $-f_j imes 2^{i-j-l}$。

    时间复杂度 $O(n^4)$,注意 $2^{64}$ 爆 unsigned long long 了。

  • 相关阅读:
    《基于大数据的高考志愿推荐系统的设计与实现》论文笔记(三)
    《高考志愿智能填报系统的设计与实现》论文笔记(二)
    一个简单但能考察C语言基础的题目
    C语言入坑指南-数组之谜
    八大排序算法
    vim学习
    C++/Python冒泡排序与选择排序算法详解
    Python查找最长回文暴力方法
    悬空指针与野指针
    二分查找
  • 原文地址:https://www.cnblogs.com/syksykCCC/p/EasyProblems.html
Copyright © 2011-2022 走看看