首页 > 其他分享 >CF1941 BCDEF 题解

CF1941 BCDEF 题解

时间:2024-03-18 19:33:06浏览次数:26  
标签:题解 复杂度 back CF1941 BCDEF 删成 差值 答案 dp

B

如果要将 \(a_1\) 删成 0,只能对 \(a_2\) 进行操作:\(a_1\gets 0,a_2\gets a_1-2\times a_1,a_3\gets a_3-a_1\)。\(a_1=0\) 后,要将 \(a_2\) 删成 0,只能对 \(a_3\) 进行相同的操作;要将 \(a_3\) 删成 0,只能对 \(a_4\) 进行相同的操作……依此类推。可以看出,这是唯一可行的删除方法。

不难发现,如果整个数组能够删空,那么对 \(a_{n-1}\) 操作后,我们将同时得到 \(a_{n-1}=a_n=0\),此时答案为 YES,否则答案为 NO。当然,如果在中途发现操作进行不了,比如对 \(a_3\) 操作时发现 \(a_3<2\times a_2\),删完之后会出现负数,则数组一定删不空,直接输出 NO 后 break 即可。

遍历一次数组,时间复杂度 \(O(n)\)。

C

如果 mappie 单独出现,应该直接删除中间的字母 ai——如果遇到 mmap 或者 piee 这样的字符串,删除头尾的字母可能消不掉该单词。而当出现 mapie 子段时,显然应该删除 p

遍历字符串,当 s[i:i+5] == "mapie" 时,答案 +1,循环变量 +5;否则检查 s[i:i+3] == "map || s[i:i+3] == "pie",成立则答案 +1,循环变量 +3。时间复杂度 \(O(n)\)。

D

用 unordered_set 记录每一轮球可能在的位置,每一轮对 set 中的所有元素进行更新。元素最多出现在 \(n\) 个位置,共有 \(m\) 轮,注意最后要对答案排序,时间复杂度 \(O(nm+n\log n)\)。

E

先求出在每一行架桥的最小值,再用前缀和求出连续 \(k\) 行的最小和,这要求每一行求最小值的复杂度不超过 \(O(m)\)。

动态规划,考虑设 \(dp_{i,j}\) 表示第 \(i\) 行架桥,在第 \(j\) 列放了桥墩时截至该列的最小造价,显然有 \(dp_{i,j}=\min_{t=j-d-1}^{j-1}dp_{i,t}+a_{i,j}+1\)。复杂度 \(O(md)\) 的求最小值部分可以单调队列优化至 \(O(m)\),满足条件。

dp 代码如下:

rep(i, 1, n) {
        dp[i][1] = 1, q.push_back(1);
        rep(j, 2, m) {
            while (!q.empty() && j - q.front() - 1 > d) q.pop_front(); // 清除超出距离的状态
            dp[i][j] = dp[i][q.front()] + a[i][j] + 1;
            while (!q.empty() && dp[i][q.back()] > dp[i][j]) q.pop_back(); // 清除比当前点远、还比当前点贵的状态
            q.push_back(j);
        }
        sum[i] = sum[i - 1] + dp[i][m];
        while (!q.empty()) q.pop_back(); // 注意清空队列
    }

F

要让最大差值最小,必须将新问题插入间隔最远的那对 \(a_i,a_{i+1}\) 之间,答案为次大差值和最大差值分开的两段取 \(\max\)。次大差值本身不会改变,我们只需要研究怎样分隔最大差值能使答案最小。

枚举 model,对每个 model 二分出一个 function,使得 \(d_i+f_j\le \lfloor\dfrac{a_{i}+a_{i+1}}{2}\rfloor\) 且 \(f_j\) 最大。对于这个 model,最优的分界点是 \(d_i+f_j\) 或者 \(d_i+f_{j+1}\)。用这两个可能的分界点和次大差值分别更新答案即可。

复杂度 \(O(n+m\log k)\)。

标签:题解,复杂度,back,CF1941,BCDEF,删成,差值,答案,dp
From: https://www.cnblogs.com/th19/p/18081098

相关文章

  • Gym 101981-I Magic Potion 题解
    传送门题意:有\(n\)个勇者和\(m\)个怪物,第\(i\)个勇者有一个可杀怪物集合\(M_i\),每个勇者只能杀各自\(M_i\)中的一个怪物。但是你有\(k\)瓶魔药,每一瓶都可以让一个勇者多杀一个\(M_i\)中的怪物。但是每个勇者只能吃一瓶药。问最多能杀多少个。考虑让勇者和怪物匹......
  • POJ3057 Evacuation 题解
    传送门题意:给定一张字符地图,#代表墙,.代表空地,D代表门。初始每个空地都有一个人。每个人可以在一秒内向上下左右移动一格。一个空地可以站任意多人。一个人走到门视作逃生成功。但是门很窄,一个时刻内只能有一个人进门。问所有人逃生的最短时间。\(n\le12\)。注意到门一个......
  • 20240318每日一题题解
    20240318每日一题题解Problem若将一个正整数化为二进制数,在此二进制数中,我们将数字\(1\)的个数多于数字\(0\)的个数的这类二进制数称为\(A\)类数,否则就称其为\(B\)类数。例如:\((13)_{10}=(1101)_2\),其中\(1\)的个数为\(3\),\(0\)的个数为\(1\),则称此数为\(A\)......
  • 20240317每日一题题解
    20240317每日一题题解ProblemSolution提供两种写法,分别用到了string类和c风格字符串。string类是标准库中提供的用于处理字符串的类,避免了传统的C语言中使用字符数组来处理字符串时需要考虑的空间分配、长度控制等问题。c风格字符串实际上就是一个字符数组char[],以字符'......
  • CF999D Equalize the Remainders 题解
    题意给定一个长度为\(n\)的序列和一个模数\(m\),记\(c_i\)表示\(\bmodm\)后的结果为\(i\)的数的个数。现在可以使每个数增加\(1\),请问最少要操作多少次才能使所有\(c_i=\frac{n}{m}\)。并输出最后的序列。First.如何最小化操作次数由于每次操作会使\(c_{a_i\bm......
  • AT_hhkb2020_e Lamps 题解
    \(\mathtt{TAG}\):计数、数学变量说明下文中\(k\)指整洁方块个数。First.如何计数?一个方案一个方案地数肯定是不现实的,不妨反过来想:每个方块在多少个方案中被照亮。Second.如何求多少个方案首先预处理出有多少位置可以将\(s_{i,j}\)照亮。记为\(x\)。这个很简单,不......
  • CF933-Div3 大致思路+题解
    A-RudolfandtheTicket纯水题暴力枚举直接过$code$#include<bits/stdc++.h>#definefo(x,y,z)for(int(x)=(y);(x)<=(z);(x)++)#definefu(x,y,z)for(int(x)=(y);(x)>=(z);(x)--)inlineintqr(){ charch=getchar();intx=0,f=1; for(;ch<'0......
  • 【题解】A18535.来自领导的烦恼
    题目跳转思路:本题可以使用动态规划或递归的方式来实现,本质上是一道01背包的变型题。假设一共有\(n\)名员工,每一位员工的技能水平用\(a[i]\)表示。要使得两个部门的员工技能总和之差最小,意思就是尽可能地将一个部门的技能之和”凑“到\(\sum\limits_{i=1}^{n}a[i]\times\frac{1}......
  • 【题解】A18536.星光交错的律动
    题目跳转思路:这道题可能跟博弈论有一点关系,没有学习过博弈论做起来应该问题也不大。思考一个问题,先手必胜的前提是什么?有关更多的内容可以前往:浅谈有向无环图先手必胜的前提是,在任何一种局面下,先手都有至少一种操作可以使后手处于必败的局面。若先手进行任何操作后,后手都可以......
  • 【题解】A18537.我心中珍藏的游戏
    题目跳转思路:题目问最多可以获得的额外伤害,其实就是询问在这些技能中,如何怎样选取一个最优的发动技能顺序使得攻击加成最大。我们可以把每一个技能看作成一个图的顶点,把每一个攻击加成看作图的边,权制为\(Ei,j\)。由于\(Ei,j\)与\(Ej,i\)相等,则可以将这个图视为无向图。可以样样......