账号 1:Eason_OIer, n o w r a t i n g = 1431 , P u p i l \bf{now\ rating=}\color{cyan}\ \bf{1431, Pupil} now rating= 1431,Pupil。
账号 2:Eason__cyx, n o w r a t i n g = 772 , N e w b i e \bf{now\ rating=}\color{gray}\ \bf{772, Newbie} now rating= 772,Newbie。
记录 Div.1+2 / Div. 2 中不超过 *2400 的题的题解。
Codeforces Round 997 (Div. 2)
惨败,rk7283,1647-95=1552,Expert -> Specialist。呜呜我的蓝名(
A. Shape Perimeter
大概是最近的 Div.2 中算比较困难的一道?
不太好说思路,画了个图:
那么直接算就行了。时间复杂度 O ( n ) O(n) O(n)。提交记录
B. Find the Permutation
唐诗题,题意很史。
首先你会发现如果 g i , j = 1 g_{i,j}=1 gi,j=1,那么其实一定有 i < j i < j i<j。并且,假设 i i i 在排列中的位置是 i d i id_i idi,那么一定有 i d i < i d j id_i < id_j idi<idj。题意就是这个。
首先从 1 1 1 的情况入手。不难发现, g 1 , i g_{1,i} g1,i 中一共有几个 0 0 0, 1 1 1 的前面就有几个数。那么就可以确定 1 1 1 的位置。然后对于 2 2 2,此时它与 1 1 1 的位置关系和与 3 ∼ n 3 \sim n 3∼n 的位置关系也确定了,那么也可以确定他的位置。后面的数以此类推。
那么就可以得到整个排列了。时间复杂度 O ( n 2 ) O(n^2) O(n2)。提交记录
C. Palindromic Subsequences
这种题都没有观察出来???赛时糖丸了,赛后立刻出做法。
考虑构造 1 , 1 , 2 , 3 , 4 , … , n − 2 , 1 1,1,2,3,4,\dots,n-2,1 1,1,2,3,4,…,n−2,1。这样,最长的回文子串长度为 3 3 3。首先第一个 1 1 1 和最后一个 1 1 1 放两边,中间随便加个数都行,这样的方案有 n − 2 n-2 n−2 种;然后第二个 1 1 1 和最后一个 1 1 1 放两边,中间也可以随便加个,方案有 n − 3 n-3 n−3 种,一共加起来就是 g ( a ) = n − 2 + n − 3 = 2 n − 5 > n g(a) = n-2+n-3=2n-5>n g(a)=n−2+n−3=2n−5>n,可以通过。时间复杂度 O ( n ) O(n) O(n)。提交记录
-D. Unique Median
妙妙题,参考了官方题解。
考虑一个子段 [ l , r ] [l,r] [l,r] 什么时候是坏的。首先必要条件显然就是 r − l + 1 r-l+1 r−l+1 是偶数。那么假设 [ l , r ] [l,r] [l,r] 的中位数是 x x x,如果这个子段是坏的,那么一定有 r − l + 1 2 \frac{r-l+1}{2} 2r−l+1 个数 ≤ x \le x ≤x, r − l + 1 2 \frac{r-l+1}{2} 2r−l+1 个数 > x >x >x,这样就满足条件了。
接下来考虑怎么计数。因为 1 ≤ a i ≤ 10 1 \le a_i \le \color{red}\bf{10} 1≤ai≤10,所以我们从这里入手。考虑枚举中位数是 x x x 时的答案。我们可以建立 b b b 数组,如果 a i ≤ x a_i \le x ai≤x,那么 b i = − 1 b_i=-1 bi=−1;否则 b i = 1 b_i=1 bi=1。那么只要有一个子段的和是 0 0 0,就说明这个子段是坏的了。那么数一下即可。时间复杂度 O ( n V ) O(nV) O(nV), V V V 是值域,这里 V = 10 V=10 V=10。
代码还没写,咕咕咕。
CodeForces Round 999 (Div. 1+2)
又掉分了 /ll /ll /ll 赛时过了 ABD。
A. Kevin and Arithmetic
分讨。如果这个数组中没有偶数,那么第一次不能得分,后面都可以。那么答案就是 n − 1 n-1 n−1。
如果有偶数,假设有 c c c 个偶数和 n − c n-c n−c 个奇数,你会发现偶数除了第一个以外都是没法得分的,所以我们将其放在最前面。那么所有奇数都可以得分。那么答案就是 n − c + 1 n-c+1 n−c+1。
做完了。时间复杂度 O ( n ) O(n) O(n)。提交记录
B. Kevin and Geometry
简单题。
假设等腰梯形上底为 a a a,腰为 b b b,下底为 c c c,那么只要 a + 2 b > c a+2b > c a+2b>c 就可以组成等腰梯形。那么考虑贪心,找到最小的两个相等的边,然后排序,枚举剩下的所有的数,如果和他相邻的数和他的差小于两条腰的和,那么就可以。
时间复杂度 O ( n log n ) O(n \log n) O(nlogn)。提交记录
C. Kevin and Puzzle
赛时没有瞪出来怎么 dp()
直接设 d p i dp_i dpi 表示第 i i i 个人是诚实的,前 i i i 个人的方案数。然后分讨:
-
如果第 i − 1 i-1 i−1 个人是诚实的,那么有 a i − 1 = a i a_{i-1}=a_i ai−1=ai,此时应该有 d p i = d p i + d p i − 1 dp_i = dp_i + dp_{i-1} dpi=dpi+dpi−1。
-
否则,因为骗子不会相邻,那么第 i − 2 i-2 i−2 个人一定是诚实的,此时应该有 a i − 2 + 1 = a i a_{i-2}+1=a_i ai−2+1=ai,有 d p i = d p i + d p i − 2 dp_i = dp_i + dp_{i-2} dpi=dpi+dpi−2。
最终答案就是 d p n + d p n − 1 dp_n+dp_{n-1} dpn+dpn−1。(这是因为,第 n n n 个人可能是骗子)
时间复杂度 O ( n ) O(n) O(n)。多测记得清空。提交记录
D. Kevin and Numbers
很有趣的题。
正着维护合并不太好做,所以我们反着想,考虑如何将 b b b 中的数拆分为 a a a 里的数。
由于合并两个数 x x x, y y y 需要满足 ∣ x − y ∣ ≤ 1 |x-y|\le1 ∣x−y∣≤1,所以对于一个数 k k k,只能由 ⌊ k 2 ⌋ \lfloor\dfrac{k}{2}\rfloor ⌊2k⌋ 和 ⌈ k 2 ⌉ \lceil\dfrac{k}{2}\rceil ⌈2k⌉ 合并而来。又因为每次拆分会多出来 1 1 1 个元素,所以我们需要恰好拆 n − m n-m n−m 次。
接下来考虑怎么拆。对于 b b b 中当前最大的一个数,如果其已经在 a a a 中出现过了,那么将其与 a a a 中的那个数一起删掉;否则,如果可以拆分的话,这个数一定是被拆开的,那么将这个数拆开即可。这样就可以通过了。
上面过程涉及的最大值和删除操作,可以用一个优先队列维护
b
b
b,一个 map
维护
a
a
a,即可解决。时间复杂度大致是
O
(
(
n
−
m
)
log
(
log
V
+
log
m
)
)
O((n-m) \log (\log V + \log m))
O((n−m)log(logV+logm))。提交记录
【待补】E. Kevin and And
【待补】F1. Kevin and Binary String (Easy Version)
CodeForces Round 1000 (Div. 2)
A. Minimal Coprime
笨蛋题。。。
你不难发现只有 [ x , x + 1 ] [x,x+1] [x,x+1] 才是这个所谓的“最小互素线段”。那么对于区间 [ l , r ] [l,r] [l,r],答案就是 r − l + 1 − 1 = r − l r-l+1-1=r-l r−l+1−1=r−l。特判特殊情况: [ 1 , 1 ] [1,1] [1,1]。
时间复杂度 O ( 1 ) O(1) O(1)。提交记录。
B. Subsequence Update
困难题。
考虑到如果你的子序列中包含了 i p < l i_p<l ip<l 和 i q > r i_q>r iq>r,那么这两个元素互换之后依然不会对答案产生贡献,所以是不优的。那么所以,产生答案只可能有两种情况:一种是子序列中的所有元素都在 [ l , n ] [l,n] [l,n] 之间,另一种是子序列的所有元素都在 [ 1 , r ] [1,r] [1,r] 之间。那么把这两个序列取出来排序取前 r − l + 1 r-l+1 r−l+1 小就是答案。
时间复杂度 O ( n log n ) O(n \log n) O(nlogn)。提交记录
【待补】C. Remove Exactly Two
【待补】D. Game With Triangles
【待补】E. Triangle Tree
【待补】F1. Counting Is Not Fun (Easy Version)
CodeForces Round 1001 (Div. 1+2)
A. String
不难发现每次操作都会减少一个 1
。那么数一下 1
的个数就是答案。单组时间复杂度
O
(
∣
s
∣
)
O(|s|)
O(∣s∣)。
B. Clockwork
/bx /bx /bx
考虑对于一个位置 i i i,我们肯定是需要不停地在 1 1 1 和 n n n 之间所有数之间来回移动的,那么在位置 i i i 至少需要花费的时间是 2 × max ( i − 1 , n − i ) 2 \times \max(i-1,n-i) 2×max(i−1,n−i)。如果所有 t i t_i ti 都大于这个值,那么一定可以满足条件。反之,肯定有一个会来不及移动。
时间复杂度 O ( n ) O(n) O(n)。提交记录
-C. Cirno and Operations
不难发现如果先反转再差分,和先差分再反转的区别就是总和取了个反。那么任意的操作序列都可以看成先做了一些差分,然后反转,然后取一些反。那么我们可以直接枚举做了几次差分,然后取绝对值,找最大值即可。时间复杂度 O ( n 2 ) O(n^2) O(n2)。
注意不做差分是不能取反的。
【待补】D. Balanced Tree
【待补】E1. The Game (Easy Version)
CodeForces Round 1002 (Div. 2)
只过了一题,耻辱!!!
A. Milya and Two Arrays
因为每个元素都至少有两个,所以我们只要找到两个数组中各有两个不一样的元素即可,或者如果一个数组全是一样的,另一个数组有三种以上不同的元素也行。时间复杂度 O ( n ) O(n) O(n) 或 O ( n log n ) O(n \log n) O(nlogn),取决于拿啥东西计数。提交记录
【待补】B. Cost of the Array
【待补】C. Customer Device
CodeForces Round 1004 (Div. 1+2)
上分啦。
A. Adjacent Digit Sums
讨论两种情况:
-
第一种, x x x 的个位数 ≠ 9 \not = 9 =9。那么显然有 y = x + 1 y=x+1 y=x+1。
-
第二种: x x x 的个位数 = 9 =9 =9。那么 + 1 +1 +1 之后个位变 0 0 0,十位加一,这样就有 x − y = 8 x-y=8 x−y=8。但是十位可能也是 9 9 9,观察可以得到不管如何进位 x − y x-y x−y 一定是 8 8 8 的倍数。
这样就做完了。时间复杂度 O ( 1 ) O(1) O(1)。提交记录
B. Two Large Bags
感觉就乱贪心啊。
考虑从小到大枚举当前是哪个数。然后:
-
如果当前这个数出现的个数为偶数,那么留下两个这个数,剩下的全部变成这个数 x + 1 x+1 x+1。
-
如果当前这个数出现的个数为奇数,且前面已经有某个数是奇数,那么判断这两个数之间是否所有数都可以出现,如果可以,那么这两个奇数都可以变成偶数。
如此贪心,整个过程结束后判断是否所有数的出现个数都是偶数个即可。提交记录
C. Devyatkino
不会证,啊吧啊吧。
你观察样例发现每次加的 7 7 7 的个数好像都是一样的。那么枚举一下每次操作都加几个 7 7 7 组成的数,然后取个最小值就完了。提交记录
D. Object Identification
牛的,这场 Div. 2D = Div. 1A,然后这题直接硬控 jiangly 50 分钟。/bx
首先判断这个
x
x
x 是不是一个排列;如果不是,那么假设这是一张图,那么显然这个点是不可以到达任何一个点的。所以假设在
x
x
x 中数
k
k
k 没有出现,则我们可以询问 ! k k+1
(注意
k
=
n
k=n
k=n)。因为如果是
n
n
n 个点的情况,那么这些点两两互不相同,所以距离不可能是
0
0
0;我们可以根据这个判断,如果是
0
0
0,那么就是第一种;否则是第二种。
那么如果
x
x
x 是排列呢?我们可以先找到
x
p
1
=
1
x_{p1}=1
xp1=1 和
x
p
2
=
n
x_{p2}=n
xp2=n。然后我们询问 1 p1 p2
和 1 p2 p1
,得到两个结果
ans1
\text{ans1}
ans1 和
ans2
\text{ans2}
ans2。那么对于
n
n
n 个点来说,显然应当有
ans1=ans2
\text{ans1=ans2}
ans1=ans2,即他们如果不相等,就一定是第一种情况。如果他们相等,说明如果是图,那么图中可能有环。但是如果有环,又由于只有
n
n
n 条边,所以两个答案最大为
n
2
\dfrac{n}{2}
2n。但是如果是
n
n
n 个点,那么一个横坐标是
1
1
1,另一个横坐标是
n
n
n,距离一定
≥
n
−
1
\ge n-1
≥n−1!
那么就做完了。时间复杂度 O ( 1 ) O(1) O(1)。提交记录
CodeForces Round 1005 (Div. 2)
A. Brogramming Contest
代码还没补。
首先我们在整个字符串前面补一个 0
。那么每次操作就是找到最右边的形如 01
的这个位置,然后把这个 1
后面的全部挪到
t
t
t 里去即可。时间复杂度
O
(
n
)
O(n)
O(n)。
Educational Codeforces Round 174 (Rated for Div. 2)
没打,补题。
A. Was there an Array?
考虑什么时候无解。不难发现如果有三个连续的
b
i
b_i
bi 形如 1 0 1
的时候,第一个应当和第二个相等,第三个也应该和第三个相等,那么,这三个都应该相等。那么第二个就应该是
1
1
1,和前面矛盾。所以这种情况就无解。
时间复杂度 O ( n ) O(n) O(n)。提交记录
B. Set of Strangers
个人觉得比 A 好想。
观察得到对于相同的数来说,至多需要两次就可以将他们全部变成另一个数。又发现 a i a_i ai 值域不大,所以考虑记 f i f_i fi 表示所有 i i i 如果要全部变成别的数需要几次操作,不难发现 0 ≤ f i ≤ 2 0 \le f_i \le 2 0≤fi≤2。这个可以 O ( n m ) O(nm) O(nm) 计算。那么算完之后根据贪心,选择操作次数最多的任意一个数,然后最优策略就是将所有数变成这个数。所以最终答案就是 a n s = ∑ f i − max f i ans=\sum f_i - \max f_i ans=∑fi−maxfi。时间复杂度 O ( n m ) O(nm) O(nm)。提交记录
注意, 700 × 700 = 490000 700 \times 700 = 490000 700×700=490000,不是 49000 49000 49000。/oh
C. Beautiful Sequence
困难题。一个重要的性质是 1 ≤ a i ≤ 3 \color{red}\bf{1 \le a_i \le 3} 1≤ai≤3。那么考虑从这入手,设 f 1 / 2 / 3 f_{1/2/3} f1/2/3 表示当前考虑的这个数是 1 / 2 / 3 1/2/3 1/2/3 时的方案数。
然后?你会发现这里说的一个数前面有数比他大有点怪,仔细考虑一下。假设 a x a_x ax 前面比它小的离他最近的是 a p x ap_x apx。那么不难发现 a p a p a p … = 1 ap_{ap_{ap_{\dots}}} = 1 apapap…=1。所以第一个数一定比后面所有数小,同理最后一个数一定比前面所有数大。又因为 a i a_i ai 的范围,所以只能 a 1 = 1 , a siz = 3 a_1=1,a_{\text{siz}}=3 a1=1,asiz=3,剩下的是 2 2 2。那么计算方案数就不难了,有转移方程:
f i = f i + f i − 1 + [ i = 2 ] × f i f_i=f_i + f_{i-1} + [i = 2] \times f_i fi=fi+fi−1+[i=2]×fi
(其实本来是 f i , 1 / 2 / 3 f_{i,1/2/3} fi,1/2/3 的,这里直接滚动数组了)
那么做完了。时间复杂度 O ( n ) O(n) O(n)。提交记录