Atcoder ABC 216

前言:蛤蛤蛤,我没打的atcoder的比赛都能混不少 rating

A~C:咕咕咕


D: b a k [ i ] bak[i] bak[i] 表示 i i i s t a c k [ b a k [ i ] ] stack[bak[i]] stack[bak[i]] 的顶部出现过(或者现在就在顶部)。

如果发现当前这个数 x x x b a k [ x ] ≠ 0 bak[x] \neq 0 bak[x]=0,那么这个时候两个 x x x 一定能匹配(因为 s t a c k [ b a k [ x ] ] stack[bak[x]] stack[bak[x]] 此时一定没有弹走 x x x),那么就把这两个可以弹出的 s t a c k stack stack 的编号扔进队列。

把第一轮顶部出现的相同的数全部扔进队里后,开始处理队列里的东西。取出来一对 ( x . f i r s t , x . s e c o n d ) (x.first, x.second) (x.first,x.second) 后,把 s t a c k [ x . f i r s t / s e c o n d ] stack[x.first/second] stack[x.first/second] 里的顶部弹出,然后判断新的顶部有没有在其他 s t a c k stack stack 的顶部出现,如果有,则将对应的两个 s t a c k stack stack 的编号扔进队列,否则更新 b a k bak bak

code


E: 想到每次肯定是取最大的,所以从大到小跑,先从小到大排序,假设现在所有大于 a [ i ] a[i] a[i] 的数都减到了 a [ i ] a[i] a[i],那么现在有 n − i + 1 n - i + 1 ni+1 a [ i ] a[i] a[i],这时候我们要判断次数够不够减到 a [ i − 1 ] a[i - 1] a[i1],如果不会减到,那么就算出这 n − i + 1 n - i + 1 ni+1 a [ i ] a[i] a[i] 要同时减去多少次,然后再减去没用完的次数的,如果减得到,那么计算出目前所有的 a [ i ] a[i] a[i] 变为 a [ i − 1 ] a[i - 1] a[i1] 的贡献,将次数减去 ( n − i + 1 ) ( a [ i ] − a [ i − 1 ] ) (n - i + 1)(a[i] - a[i - 1]) (ni+1)(a[i]a[i1]),然后继续枚举即可。

最后可能会出现跑到 1 1 1 的情况,这个时候就一直减,直到为零。

code


F:将每个二元组 ( a i , b i ) (a_i, b_i) (ai,bi) 按照 a a a 为第一关键字排序,考虑 m a x j ∈ S a j = a i max_{j \in S} a_j = a_i maxjSaj=ai,那么只需要满足 S S S 中最大的数不超过 i i i,必须包含 i i i,并且 ∑ j ∈ S a j ≤ a i \sum_{j \in S}a_j \leq a_i jSajai 即可,不超过 i i i 且必须包含 i i i 很好处理,就是从 1 1 1 n n n 枚举,选的数都必须小于 i i i ,然后把 ( a i , b i ) (a_i, b_i) (ai,bi) 单独拎出来必选。

考虑第三个条件,容易想到 d p dp dp,设 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示 S S S 在前 i − 1 i - 1 i1 个中选择,和为 j j j S S S 的选法个数,滚动一下,把第一维省去,然后统计答案时求个前缀和即可。

细节见代码,就不细讲了。

code


G:

就是贪心模板题:区间选点。贪心策略是按照 l l l 从小到大排序,然后考虑第 i i i 个区间,如果选的数不够,那么就尽可能地选择更大的数。

法一:用线段树维护,担心卡常就用二分线段树即可。

法二: i d e a idea idea 来自 Rainybunny 大巨佬,大致的意思就是说,假设现在我们前 i − 1 i - 1 i1 个数放不放都已经确定好了,那么对于所有满足 l j ≤ i ≤ r j l_j \leq i \leq r_j ljirj的区间,它最多还能放 r j − i + 1 r_j - i + 1 rji+1 个数,如果发现这个区间还需要填的数的个数等于了 r j − i + 1 r_j - i + 1 rji+1,那么就在 i i i 处放数,这是实现的方法。大致思路的话就是第 i i i 个点能不放就不放,尽可能让后面的点放数,除非这个点不放就有区间放不够 x i x_i xi 个数了,所以实际上和贪心的结果是一样的,但是代码短了不止亿点点。

法一code
法二的 code 就看 Rainybunny 巨佬的吧。


H:咕咕咕

posted @ 2021-09-01 23:09  C2022lihan  阅读(14)  评论(0编辑  收藏  举报