A|GC003

AGC003


A Wanna go back home

= =

https://agc003.contest.atcoder.jp/submissions/7910739

B Simplified mahjong

直接腾讯。

https://agc003.contest.atcoder.jp/submissions/7910863

C BBuBBBlesort!

考虑将(a)分成(L=a[::2])(R=a[1::2]),这两个序列可以不消耗代价随意打乱,或者可以交换(L_i)(R_i)

所以如果从两个序列中分别拿出一个元素交换代价是(1)

计算有多少起始序列!=目标序列的数,答案就是(lfloor cnt/2 floor)

https://agc003.contest.atcoder.jp/submissions/7910962

D Anticube

对每个数(x=Pi p_i^{e_i}),将其变成最简形式(Pi p_i^{E_i=e_imod 3})不影响答案

然后一个数(x=Pi p_i^{E_i})对应的满足(xy)是完全立方数的(y)只有一个,那就是(Pi p_i^{-E_imod 3})

对每个数计算一下出现了几次,如果它和另一个数互斥,则删掉数量较小的那一堆

(特判一下,如果有一堆化简后是(1)就代表都是完全平方数,会和自己互斥,这一对只能随便选(1)个)

E Sequential operations on Sequence

毒瘤

对于缩小操作,那么前面一些操作会没用,先用一个单调栈去除掉无用操作,这样(q)就单调递增了

从后往前考虑,每次拿出最后一个操作,计算它对答案的贡献

(q_i)会从(q_{i-1})循环复制过来,就会被分成很多个(q_{i-1})和一段前缀

维护一个(mul_i),这差不多是一个标记,表示最后的序列会加上(mul_icdot A[1,q_i])

(最后序列加上(kcdot A[1,r])的意思是会再出现(k)个和(A[1,r])一样的数

具体要实现这样一个函数:(work(p,M)),表示最后序列加上(Mcdot A[1,p])

如果(pleq q_1)(q_1)一定不大于(n))那么(ans_1)(ans_p)要加上(M)

否则和前面一样的,找到第一个可行的操作,然后递归下去

具体看代码= =

https://agc003.contest.atcoder.jp/submissions/7917606

F Fraction of Fractal

神题Orz

首先特判掉一些情况:

  • 上下连通(上下拼起来仍连通)且左右连通,那么最后一定依然连通,输出1
  • 上下,左右都不连通,那么最后每次分形都不会有连通块接在一起,答案是(cnt_1^{K-1})

现在只有一种情况:左右连通(上下的话翻过来

1e18显然要矩乘dp,设(f_{i,0})表示(i)层分形图的连通块数,(f_{i,1})表示((在当前图形最左有东西)和(如果左右拼这个图形,该连通块会和更左边一个连通块拼接(这个连通块可能是自己也可能是原来最右边的连通块)))的(x)连通块数

现在是转移,

(f_{i,1}=f_{i-1,1} imes c)(c)为在初始图形最左和最右都有东西的(x)坐标数

(f_{i,0}=f_{i-1,0} imes cnt_1-f_{i-1,1} imes a)(a)为初始图形左右相邻两个坐标都是1的方案数

就可以矩乘了

https://agc003.contest.atcoder.jp/submissions/7919234

原文地址:https://www.cnblogs.com/xzz_233/p/11644709.html