首页 > 其他分享 >AtCoder Regular Contest 170

AtCoder Regular Contest 170

时间:2024-01-31 22:13:20浏览次数:18  
标签:AtCoder 答案 Contest sum times Regular 端点 170

A

贪心。

首先判无解。

如果一个位置要变成 A,那么它右边必须要有个 B。

如果一个位置要变成 B,那么它右边必须要有个 A。

然后算答案,首先有一个明显的上限:

\[\sum_{i=1}^{n}[s_i \neq t_i] \]

假设我们有 \(i\) 位置要变成 A,\(j\) 位置要变成 B,且 \(i<j\),那么可以减少一次操作,扫一遍即可,\(O(n)\)。

B

明显的难度区别:A>>B。

枚举 \(j\) 和公差,寻找最近的 \(i\) 和 \(k\)。

如何更新答案?我们要知道固定左端点的情况下枚举右端点,是否是“好对”这一条件是有单调性的。

我们设 \(f_i\) 为固定左端点为 \(i\) 的情况下,最小的 \(j\) 使得 \((i,j)\) 为好对。

假设我们搜索出了一个 \((i,k)\) 对,那么对于 \(f_{1} \sim f_{i}\),都要对 \(k\) 取个 \(\min\)。

具体实现上是做了一个 lazytag,每次只标记了 \(i\) 一个点,然后最后统计答案的时候往前推一遍 tag 即可。

答案为:

\[\sum_{i=1}^{n}(n-f_i+1) \]

C

非常厉害的 dp。

当 \(m>n\) 的时候,答案一定是:

\[m^{\sum_{i=1}^{n}[a_i=0]} \]

当 \(m \leq n\) 的时候,细细考虑一下:

我们只关心当前前缀的 \(\operatorname{mex}\) 是否为 \(i\)。

  • \(a_i=1\) 的时候相当于强制干掉最左边的空位。

  • \(a_i=0\) 的时候相当于找别的地方填一下即可(可重复填)。

假设取了一个 \(i\) 称为占了一个格子。

设 \(f_{i,j}\) 表示前 \(i\) 个占掉了 \(j\) 个格子的方案数。

则有转移:

\[f_{i,j}= \begin{cases} f_{i-1,j-1} & a_i=1 \\ j \times f_{i-1,j}+(m-j+1) \times f_{i-1,j-1} & a_i=0 \end{cases} \]

时间复杂度 \(O(n^2)\)。

值得注意的是,这里的转移系数都不与 \(i\) 有关,那么有没有神仙能优化优化呢?

D

考虑人类智慧做法。

排序 \(a\) 和 \(b\),然后猜测选完 \(a\) 以后 \(b\) 一定是选择较大或较小的几个,接着我们二分第二次选 \(a\) 中是否可行。

继续猜测!前后扫描 15 个差不多就可以 A 掉了,事实也确实是这样。

标签:AtCoder,答案,Contest,sum,times,Regular,端点,170
From: https://www.cnblogs.com/acwing-gza/p/18000229

相关文章

  • 洛谷题单指南-暴力枚举-P1706 全排列问题
    原题链接:https://www.luogu.com.cn/problem/P1706题意解读:n个数全排列问题,本质上,给定n个空位,枚举每个能填入空位的数,依次填入,每个数只能填一次。解题思路:如何填入n个数呢,可以借助于递归,流程如下:dfs(填入第k个数){如果已经填满n个数输出结果返回......
  • AtCoder Beginner Contest 338
    ABC338总结A-Capitalized?翻译给你一个由大写和小写英文字母组成的非空字符串\(S\)。请判断是否满足以下条件:\(S\)的第一个字符是大写字母,其他所有字符都是小写字母。如果满足,输出Yes,否则输出No。分析按题目说的判断即可。code#include<bits/stdc++.h>usingn......
  • AtCoder Beginner Contest 337
    ABC337总结A.Scoreboard翻译Takahashi队和Aoki队进行了\(N\)场比赛。在\(i\)/th比赛\((1\leqi\leqN)\)中,Takahashi队得了\(X_i\)分,Aoki队得了\(Y_i\)分。在\(N\)场比赛中总得分较高的队伍获胜。输出获胜者。如果两队总得分相同,则输出Draw。分析将得分分别加起来......
  • AtCoder Beginner Contest 338 c题二分思路
    观察题目可知,会有一个最大的x(两个菜的最大制作数),大于这个x就不能做任何一盘菜,小于这个x那么一定可以做出来,这样分析就是显而易见的递归。实现递归的check函数,那么我们就可以把两个菜的总制作数传进去。那么什么时候true什么时候false呢,就是判断每种材料的制作量有没有超过原材料......
  • AtCoder Beginner Contest 338
    A-Capitalized?#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;usingi32=int32_t;usingpii=pair<int,int>;constintinf=1e9,INF=1e18;i32main(){strings;cin>>......
  • hihocoder#1707 麻烦的第K大问题
    由区间第\(x\timesy\)大又到多重集第\(k\)大从普通的元素到我们要求的\(ans\)之间是有大小关系的(在区间内\(<-->\)区间第\(x\timesy\)大\(<-->\)多重集内第\(k\)大)再加上二分时产生的单调性:此时设二分的值为\(mid\),标记数组为\(b[]\)\[b_i=\begin{cases}......
  • AtCoder Beginner Contest 338
    基本情况A忘记大小写敏感卡了20分钟,BC秒了,E用树状数组草过去了,D错了25个点,似乎是交界没有判断好。B-FrequencyB-Frequency(atcoder.jp)这题还可以更优雅点。intmain(){strings;cin>>s;map<char,int>cnt;for(inti=0;i<s.size();i++......
  • AtCoder Beginner Contest 338
    基本情况:A和B直接秒了,C题没写出来大致是思路的问题,下面就讲一下C自己的思路和题解C-LeftoverRecipes题目概述,先输入一个数字代表有多少中配料,然后依次输入A菜每种配料所需的量,然后输入B菜每种配料所需的量,最后输出最多可以做多少盘菜样例:280030010010020010输出为......
  • AtCoder Beginner Contest 338
    AtCoderBeginnerContest338ABC切ABC,什么实力。C-LeftoverRecipesProblemStatementYourrefrigeratorhas\(N\)kindsofingredients.Letuscallthemingredient\(1\),\(\dots\),ingredient\(N\).Youhave\(Q_i\)gramsofingredient\(i\).......
  • AtCoder Beginner Contest 338
    AtCoderBeginnerContest338A-Capitalized?代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;voidsolve(){strings;cin&......