其他分享
首页 > 其他分享> > 刷(shui)题记录 2022.3

刷(shui)题记录 2022.3

作者:互联网

[CF-1148F] Foo Fighters

\(\Rightarrow \rm luogu\) 链接

考虑将所有数按照 \(mark\) 在二进制下的位数进行分类,具体而言,设 \(p(x)\) 表示 \(mark_x\) 在二进制下最高的,为 \(0\) 的位置(可以认为 \(p(mark_x)=\lfloor\log_2 mark_x\rfloor\) ),将所有数按照 \(p(x)\) 分类。

接着按 \(p(x)\) 从小到大处理,假设当前枚举的数位为 \(P\) ,将当前 \(p(x)=P\) 的 \(val_x\) 都加起来,如果已经反过来了,\(s_P=0\) ;否则 \(s_P=1\) ,更新 \(val\) 。

\(\Rightarrow \texttt{Code}\)

[PKUSC2018] 最大前缀和

\(\Rightarrow \rm luogu\) 链接

这里设定最大前缀和位为前缀和等于最大前缀和的最后一个位置。一个位置 \(p\) 是最大前缀和位当且仅当同时满足下列条件:

稍微解释一下,因为这里最大前缀和位不能取到 \(0\) ,而最大前缀和位可能小于零,因此第一个条件的范围是 \([2,p]\) 而不是 \([1,p]\) 。

设 \(s(S)=\sum_{x \in S} a_x\) ,实际上我们可以求出每一个集合作为最大前缀对答案的贡献。接下来我们需要求出用 \(S\) 组合出的满足上述条件的序列个数。

设 \(g(S)\) 表示满足第二个条件的序列个数,可以得到:

\[g(S\cup \{i\}) \leftarrow [s(S\cup\{i\}<0 \wedge i\notin S]g(i) \]

设 \(f(S)\) 表示满足第一个条件的序列个数, \(f(S)\) 的转移和 \(g(S)\) 类似。

接下来组合答案:

\[\mathrm{ANS}=\sum_{S\subset U} \sum_{x\in S} f(S \setminus \{x\})g(U\setminus S)s(S) \]

[CF-526F] Pudding Monsters

\(\Rightarrow \rm luogu\) 链接

一个区间 \([l,r]\) 满足条件,当且仅当 \(\max_{i=l}^r a_i-\min_{i=l}^r a_i=r-l+1\) ,当然,这里的等于号可以换成小于等于号。

考虑从左到右计算每一个 \(r\) 的贡献,显然可以用两个单调栈维护一下当且每一个 \(l\) 的 \(\max\) 和 \(\min\) 值,接下来将式子的右边移到左边,即变成:\(\max_{i=l}^r a_i-\min_{i=l}^r a_i-(r-l+1)\leq 0\) ,称左式为 \(l\) 的当前值,可以发现 \(0\) 是对于当前 \(r\) ,所有 \(l\) 的当前值的最大值。这时候可以用一颗线段树实现区间加,区间查询最大值和最大值个数。

标签:前缀,记录,当且,sum,mark,rm,Rightarrow,2022.3,shui
来源: https://www.cnblogs.com/juruohjr/p/15958010.html