A|G\C003

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\rfloor\)

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

D Anticube

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

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

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

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

E Sequential operations on Sequence

毒瘤

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

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

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

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

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

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

如果\(p\leq 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}\times c\)\(c\)为在初始图形最左和最右都有东西的\(x\)坐标数

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

就可以矩乘了

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

posted @ 2019-10-09 22:02  菜狗xzz  阅读(208)  评论(0编辑  收藏  举报