2023.1.13-2023.1.18 NFLS线上集训

注: 暂未找到原题的贴了题面

Day 1

复习了基础数据结构, 包括: 分块、树状数组、线段树、线段树合并.

10道练习

T1 最优贸易简化版

题目描述

C国有 \(n\) 座城市, 编号是 \(1\)\(n\), 编号为 \(i\) 的城市有路到编号为 \(i+1\) 的城市(编号为 \(n\) 的城市没有路到其他的城市).
C国幅员辽阔, 各地的资源分布情况各不相同, 这就导致了同一种商品在不同城市的价格不一定相同. 但是, 同一种商品在同一个城市的买入价和卖出价始终是相同的.
商人阿龙再次来到C国旅游. 他还是想贩卖水晶赚取旅费, 在某个城市买入, 再另一个城市卖出.
他将从编号为 \(a\) 的城市到编号到 \(b\) 的城市. 请你帮他算算, 最多能赚多少钱.
注: 他最多进行一次买入和一次卖出.

输入格式

第一行两个整数 \(n\)\(m\), 表示 \(n\) 个城市和 \(m\) 个询问.

第二行 \(n\) 个整数, 表示 \(n\) 座城市水晶的买入和卖出的价格.

接下来 \(m\) 行, 每行两个整数, 表示阿龙要从编号为 \(a\) 的城市到编号为 \(b\) 的城市(\(a<b\)).

输出格式

对于每个询问输出阿龙能赚多少钱.

数据范围

\(n,m\)\(5e5\) 之内

思路

考虑分块,记录在块内购买并卖出的收益, 块内最大值以及块内最小值.

查询时, 左右散块 \(O(\sqrt n)\) 暴力求, 枚举整块时相当于以每个整块的右端点为断点, 左侧(包括断点)购入, 右侧售出, 即用断点右侧最大值减去断点左侧(包括断点)的最小值.

T2 弹飞绵羊

思路

史上最水紫题. 考虑分块, 每个位置记录从当前位置弹几步出当前块以及弹出当前块后落在了哪里.

询问时 \(\sqrt n\) , 修改时暴力修改所在块 \(O(\sqrt n)\).

T3 蒲公英

思路

简化题意: 区间(最小)众数

仍旧考虑分块. 任意一段区间内的众数只会是几个整块中的众数或两端散块内的任意一个数. 预处理: \(sum[i][j]\) 表示 \(1\) ~ \(i\) 块中 \(j\) 出现的次数; \(f[i][j]\) 表示 \(i\) ~ \(j\) 块的(最小)众数是多少.

T4 动态逆序对

简化题意

懒得复制全题面了, 简单叙述一下: 给定一长度为 \(n\) 的排列, 每次会删除一个数, 问每次删除前的逆序对数.

思路

删除一个数后, 逆序对减少的数为该数前面比它大的数以及该数后面比它小的数. 因此可以用树状数组. 但是每次删除树状数组上的操作时间会很大, 故考虑分块, 每次修改只对块内有效, 其余整块处理.

T5 动态最大连续和

简化题意

依旧懒得复制. 给定一个序列, 支持两种操作. 0: 修改其中一个元素; 1: 求某区间内的最大连续子段和.

思路

简单线段树, 维护区间内的和, 最大子段和, 左端点开始的最大子段和, 右端点开始的最大子段和.

T6 区间元素平方和

简化题意

给定一个序列, 支持区间加以及求区间每个元素的平方和.

思路

非常简单, 线段树打懒标记. 因为 \((x+y)^2=x^2+2xy+y^2\), 故维护以上三个项即可.

T7 子序列问题

思路

当枚举到第 \(i\) 个元素时即维护出以 \(i\) 为右端点的每个区间的贡献. 若 \(a[i]\) 未出现过, 则每个区间贡献都加一; 否则, 找出最晚出现该数字的位置, 后面的区间贡献都加一. 对于后一个操作, 可以用树状数组找.

T8 永无乡

思路

用并查集维护点的联通关系. 每个点设置一棵权值线段树. 当一个点与另一个点连通后合并两颗权值线段树即可.

T9 Tree Rotations

思路

对于每个点, 所贡献的逆序对数量来自 1:左子树; 2:右子树; 3:左右子树之间. 那么, 我们发现交换左右子树时改变的只有3贡献的值, 故深搜回溯时, 点上面记录交换了的值和不交换的值的最小值. 两棵子树的信息传递到大子树上时, 线段树合并即可.

T10 序列操作

思路

类似今天 \(T5\) 的想法, 不过修改时用懒标记操作. 好水的紫题啊

Day 2

打比赛 论快读被卡了要用scanf才不会超时这件事

8道赛题

T1 糖果

简化题意

\(n\) 千克的糖果, 两种袋子, 分别可以装 \(3\)\(5\) 千克的糖果. 求最少用几个袋子可以装完.(若无法刚好装完, 输出-1)

思路

炒鸡简单的思维题. 因为要求袋子数量最少, 故装 \(5\) 千克糖果的袋子应尽可能多. 而装 \(3\) 千克糖果的袋子一定小于 \(5\), 因为 \(5\) 个这种袋子可以用 \(3\) 个另一种袋子代替.

机房真实事件: 好多人用背包去打这道题, 教练说学算法学傻掉了...

T2 编译器对齐

题目描述

将文本居中对齐, 用星号'* '框起整个文本.
如果无法实现完美的居中对齐, 请将这一行文本向左或者向右微调(你应该在第一次遇到此类情况时将该行文本向左微调, 下一次向右, 在下一次向左...依此类推).
如果你对输出格式仍有疑惑, 请参看样例.

思路

模拟. 略.

T3 找wifi

简化题意

给出两个串. 其中, 第一串只包含+,-, 第二串只包含+,-,?, 我们要把第二串中的?改成+-, 使得两串中+-的数量分别相同.

思路

求出两串+-多几个, 则?变的+-也要相应的差, 那么就可以求出?中应有几个变成+, 再用组合数即可.

T4 爆裂魔法

就是它!!!卡快读的题目!!!(后证明数据有锅)

题面描述

给定一个集合, 每次操作可选定一个元素减去 \(a\) , 其余每个元素减去 \(b\), 保证 \((a>b)\). 求使每个元素小于等于 \(0\) 的最小操作次数.

思路

二分答案.

T5 Time to Raid Cowavans

思路

类似弹飞绵羊, 分块乱搞. \(k< \sqrt n\) 时, 用预处理好的数组处理; 否则暴力求解. 不过数据范围限制了它不能记录全部, 所以要离线去做.

T6 数组切割

简化题面

给定一个序列, 随意切割, 问有多少种切割方法使得每段的元素和大于等于0.

思路

普通 \(n^2\) DP的基础上离散化一下(每元素的绝对值再 \(1000\) 以内), 再用树状数组优化.

T7 序列操作

题面&思路

见Day1 T10

T8 按钮

题面

有一排按钮, 编号为 \(0\) ~ \(n-1\). 现在有两种操作:

  1. p l r: 将 \([l,r]\) 内的按钮都按下去一格
  2. r l r: 将 \([l,r]\) 内的按钮都向上提一格(保证这个操作与之前某个按下操作的区间一样, 且一次按下只会释放一次)

每次操作之后, 你需要输出, 现在有多少个连续段的按钮, 是复位的(在初始高度).

......

Day 3

状压dp和矩阵快速幂优化dp

10道练习

......

Day 4

打比赛

8道赛题

T1 电脑休眠

思路

小模拟. 略.

T2 新字典序

简化题面

给定一个新的字母字典序串, 它是包含 \(26\) 个小写字母的一个排列, 前面的字符小于后面的字符. 请你按照新的字典序, 对给定的字符串进行从小到大排序.

思路

根据给定的顺序写个 \(Cmp()\) 函数, 用 \(sort()\) 函数去排就好了.

T3 错字

题面

只包含 '(' 和 ')' 的括号序列, 定义其合法性:

  1. 空串是合法的.
  2. \(s\) 是合法的, 那么(\(s\))也是合法的.
  3. \(s_1\) 是合法的, \(s_2\) 是合法的, 那么 \(s_1 s_2\)也是合法的.

小A在摘抄一个合法的括号序列时, 印象中好像写错了一个字符(也可能没写错), 你需要告诉他有多少种输错的可能.

思路

枚举每个位置, 判断其是否合法. 若左括号变为右括号, 则该位置右边匹配完后只剩右括号, 且其个数加一等于左侧匹配完后剩余的左括号数. 反之同理.

T4 USACO Gourmet Grazers G

思路

明显的贪心, 若有价格相同的一批产品符合某头奶牛, 易证得选口感最小的那一份最优. 维护剩余的商品可以用 \(multiset\).

T5 Imbalanced Array

思路

由于数据范围, 我们可以考虑枚举到任意一位时 \(ans\) 累加上以该位为右端点的所有区间的贡献. 每一个最大值和最小值的差的和等于所有区间最大值的和减去所有区间的最小值的和, 所以我们可以用两个单调栈分别维护最大值和最小值, 两个变量记录以当前位置为右端点的区间的最大值和和最小值和, 就可以更新维护了.

T6 最少连通块

题面

给定 \(n\) 个点 \(m\) 条边的简单无向图, 你可以删去任意数量的边, 使得剩余图满足: 如果两个点属于同一个连通块, 那么这两个点之间必须要有直接相连的边. 求所有可行的删边方案中, 剩余图的连通块数量最小时的连通块数量.

思路

状压dp, 记录选取某些点时最小连通块数量(\(n<=18\)), 递推时枚举子集. 时间复杂度 \(O(n^3)\).

T7 Yet Another Number Sequence

思路

感谢神犇LF_Forever的指导.

看数据范围那么大, 故考虑矩阵优化DP. 如果我们要用 \(F_{i-1} * (i-1)^k\) 推出 \(F_i * i^k\), 显然, 因为有二项式展开, 故我们要用到杨辉三角. 我们若用 \(F_{i - 1} * i^0,F_{i - 1} * i^1,F_{i - 1} * i^2...F_{i-1} * i^k,F_i * i^0,F_i * i^1,F_i * i^2...F_i * i^k\) 推出 \(F_i * (i+1)^0,F_i * (i+1)^1,F_i * (i+1)^2...F_i * (i+1)^k,F_(i+1) * (i+1)^0,F_(i+1) * (i+1)^1,F_(i+1) * (i+1)^2...F_(i+1) * (i+1)^k\), 则操作矩阵应为三个杨辉三角构成的矩阵(为什么是三个以及如何分布自行思考, 非常简单). 答案我们可以加在矩阵最后一行, 则操作矩阵末尾加一行由 \(0\) 构成但末位是 \(1\) 的序列. 最后就是普通的矩阵优化dp的格式.

T8 Algebra Flash

题解

posted @ 2023-01-17 16:12  TuSalcc  阅读(166)  评论(0)    收藏  举报