[CF] 1040 Div 2 部分题解
zerc

博客又是好久没更了。。。

挖坑不填。。。

又挖了个新坑。。。


题面

题解


A. Submission is All You Need

给定非负整数可重集 SS,重复任意次操作:选取子集 S′S',将 sum(S′)\text{sum}(S') 或 mex(S′)\text{mex}(S') 添加到分数,删去 S′S'。求最大分数。

只有当 S′={0}S'=\lbrace 0\rbrace 时,mex(S′)\text{mex}(S') 比 sum(S′)\text{sum}(S') 更优。

故 ans=∑S+Count(0)ans=\sum S+\text{Count(0)}

B. Pathless

给定数组 {a},ai∈{0,1,2}\lbrace a\rbrace, a_i\in\lbrace 0,1,2\rbrace({a}\lbrace a\rbrace 中包含至少一个 00,一个 11 和一个 22) 和整数 ss,是否可以通过重排 {a}\lbrace a\rbrace 使得不存在一条从 11 到 nn 的路径(每一步均可以向左或向右移动一个单位,但起点终点确定),若可以,输出任意满足条件的 {a}\lbrace a\rbrace,不满足输出 −1-1。

分类讨论:

  • ∑ai>s\sum a_i > s:{a}\lbrace a\rbrace

  • ∑ai=s\sum a_i = s:−1-1

  • ∑ai<s\sum a_i < s:

    • s−∑ai=1s - \sum a_i = 1:{0,…,0,2,…,2,1,…,1}\lbrace 0,\dots,0,2,\dots,2,1,\dots,1\rbrace

    • s−∑ai>1s - \sum a_i > 1:−1-1

      • 至少有一个 00 与 11 相邻:显然可以;

      • 00 只与 22 相邻:则至少有一个 11 与 22 相邻,可以在 ∑ai\sum a_i 的基础上加上任意个 22 和 33 构成 ss。

C. Double Perspective

题面太长了不写了。。

g(S)g(S) 一定为 00

Sol 1

用并查集维护,每次选不会构成环的加进答案。

Sol 2

被其他线段完全包起来的线段不选。

D. Stay or Mirror

给定一个排列 pp,创建一个数组 a,ai∈{pi,2n−pi}a,a_i\in\lbrace p_i, 2n-p_i\rbrace,求最小的相邻元素交换次数使 aa 由大到小有序。复杂度要求:O(n2)O(n^2)。

对于 pi=1p_i=1:

  • Stay:贡献为 n−in-i;

  • Mirror:贡献为 i−1i-1;

删去 11,重复此过程可得对于第 ii 个元素:

  • Stayi=∑j=i+1n1 if pj>piStay_i=\sum_{j=i+1}^n 1\ \text{if } p_j>p_i;

  • Mirrori=∑j=1i−11 if pj>piMirror_i=\sum_{j=1}^{i-1} 1\ \text{if } p_j>p_i;

ans=∑i=1nmin⁡(Stayi,Mirrori)ans=\sum_{i=1}^n\min(Stay_i, Mirror_i)

E1. Interactive RBS (Easy Version)

f(t)f(t) 是 tt 中非空正则括号字串个数,通过 f(t)f(t) 找到长为 nn 括号序列 ss,n≤1000,Q≤550n\leq 1000,Q\leq 550。

首先寻找 i,ji,j 使得 si=s_i= (,sj=s_j= ):

  • f(s)≠0f(s)\not=0:

    二分查找使得 f(s1s2…si)≠0f(s_1s_2\dots s_i)\not=0 的最小的右端点,则有 si−1=s_{i-1}= (,si=s_i= );

  • f(s)=0f(s)=0:

    由题意 sn=s_n= (,s1=s_1= );

构造 t=si)(sj()t={s}_i\texttt{)(}{s}_j\texttt{()},可根据 f(t)f(t) 的结果知道 sis_i 和 sjs_j 的值。

Powered by Hexo & Theme Keep
Total words 7.1k Unique Visitor Page View