这篇博客记录下atcoder上的绿色难度的刷题记录;
ABC194 E
题解
定义\(\mathrm{mex}(x_1, x_2, x_3, \dots, x_k)\)为不出现在\(x_1, x_2, x_3, \dots, x_k\)中的最小非负整数;
给定长度为\(n\)的序列\(A\),求出最小的\(\mathrm{mex}(A_{i + 1}, A_{i + 2}, A_{i + 3}, \dots, A_{i + M})\);
这类不出现在指定区间的最大值、最小值,貌似一般都需要记录每个数字出现的位置;
首先记录下每个数字的位置\(t[A[i]]\),每次让\(t[A[i]]++,t[A[i-m]]--\);并且用\(ans\)记录当前的\(mex\),如果\(t[A[i-m]]=0\),那么\(A[i-m]\)不出现在当前\(\text{mex}\)序列中,并且如果\(A[i]\le ans\),那么它比ans更优;
code
1 |
|
ABC188 D
题解
code
1 |
|
ABC188 E
题解
给了一个\(n\)个点的有向图,以及每个点的权值\(A[i]\),一开始可以在任意一个点花费\(A[i]\)买黄金,之后通过有向图到达其他点,再在某个点\(j\)卖出黄金获得\(A[j]\)的金钱;问这个过程最多可以获利多少钱;
整张图可能是由若干个连通量构成;因为一开始可以在任意一点,那么最好的情况就是肯定一开始在买入的地方,那么贪心的想,它肯定权值\(A\)尽可能小,之后从最小点开始枚举(需要一个\(vis\)来剪枝),进行\(bfs\),每次记录遍历到当前点之前的最小的\(A\)作为买入的值\(buy\),然后每到一个点\(v\),用\(A[v]-buy\)来更新\(answer\);
用\(bfs\)也可以,从具有最小的\(A[i]\)的点\(i\)出发,遍历从\(i\)出发能到达的所有点\(j\),更新\(ans=A[j] - A[i]\);然后第二次从具有第二小\(A\)的点出发,并且这一次,不用访问那些从\(i\)出发能到达的点(因为上次一从最小权值开始出发);
另外一种做法就是,由于题目告诉我们\(x_i \lt y_i\),那么我们可以从\(1\)到\(n\)遍历点,同时遍历点\(i\)所出去的边,对于点\(u\),求出在访问\(u\)之前的点中,买入所需的最小价格\(buy\)(不包括\(u\)),之后拿\(A[u]-buy\)更新\(ans\);
code
1 |
|
1 |
|
ABC185 F
题解
方法很多,线段树、树状数组(才知道树状数组还叫作\(Fenwick tree\));异或的性质应用到区间之上;定义\(f(i) = A_1 \oplus A_2 \oplus A_3 \oplus \dots \oplus A_i\),那么\([x_i,y_i]\)之间的答案就是\(f(Y_i) \oplus f(X_i - 1)\);
code
1 |
|
ABC193 D
题解
暴力即可,枚举\(s\)与\(t\)的可能情况;
code
1 |
|
官方代码。。。。
1 |
|
1 | K = int(input()) |
ABC182 E
题解
code
1 |
|
ABC181 E
题解
一种自然的想法就是,将\(n\)个人的身高\(h\)排序,然后枚举\(w_i\),插入\(h\)中,求出所有情况下的最小值;
但是其实可以不用每次都求一边答案;其实只需要考虑插入位置;比如对于a b c x d e
和a b x c d e
;只需要预处理\(|H_{2i-1}-H_{2i}|\)和\(|H_{2i}-H_{2i+1}|\),这种题第一次见;这题标答还给了滑动窗口的解法;
code
1 |
|
ABC178 E
题解
求曼哈顿距离,比较经典; https://www.cnblogs.com/tanhehe/archive/2013/05/25/3099400.html
code
1 | n = int(input()) |