菜菜菜
C. Perform Easily
题意:
有一个吉他,有6个弦,每个弦有一个值$a_i (1\le ai\le10^9)$ ,有无穷大的击弦间隔从$1$开始,设$j$为第$j$个间隔,则击弦位置能发出的音为$a_i+j$,现有$n(1≤n≤100000)$个要发出来的音$b_i(1≤b_i≤10^9)$,求最大的间隔和最小的间隔最小的差值是多少。
题解:
如果我们把$b_i-a_j$存起来,那么我们可以把问题转化为,在这个数组内一个区间,满足这个区间包含所有要发出的声音,那么我们就可以把这些区间的最大的$a_j-b_i$和最小的作查,得到多组,然后求个最小值即可。我们可以先对$a$数组升序排序,然后用一个$set$存$\{b_i-a[6],i\}$,这样得到的数都是最小的,然后每次取最前面的值,删除,然后插入$\{b_i-a[cnt[i]],i\}$,直到$cnt[i]$等于1,这样可以保证和上面的操作是等同的。
AC代码:
1 | //I am so vegetable |
D. Shurikens
题意:
现在你有$n$个物品,每个物品的价值是$1,2,3,\dots,n$,现在有$n$个人来买你的东西,买的时候都会买货架上最便宜的,现在给你一个清单,表示的是什么时候摆物品和卖出物品的价值。如果这个清单符合要求,则输出摆放的顺序,否则输出$NO$。
题解:
因为我们在放物品的时候,总是要考虑最后放的物品,则我们可以把这个操作倒过来,定义一个$ans$数组,进行一个单调栈的维护,当我们遇到’-‘的时候如果栈为空,直接压入,否则判断栈顶元素是否大于这个元素,如果大于则压入,否则直接输出”NO”;当我们遇到’+’的时候,如果栈为空,则跳过,否则将栈顶元素存入数组$ans$,最后将$ans$倒序遍历输出即可。
AC代码:
1 | //I am so vegetable |
- 本文作者: baddog
- 本文链接: https://katoli.github.io/2020/10/27/CF-679-Div-2-部分/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!