2021.10.10

T1

其实很简单,没有必要用题解方法。我们只需要先计算出每一个位置在吃多少次之后就吃不到了。(一开始就吃不到的可以先删掉)

之后按照这个次数从小到大枚举,维护当前在剩下的序列中的位置即可。

每一次删除一个点需要判断当前位置是否需要减1。用树状数组判断即可。

剩下的位置的序号可能这样的:

1 3 5 9 11

即如果当前在第4个位置(即9),那么删去5(不是第5个位置)的时候位置就要减一(变为当前在第3个位置)。

不给代码,因为很简单,可以自己写。


T2

部分分:

  • 第一档 40:设\(f(state,i,j)\)表示当前经过关键点的状态为\(state\),当前在\(i\),走了\(j\)次的方案数。转移按照状压套路转移即可。

  • 第二档 50:发现d很大。对于k=0的情况,可以直接用矩阵计算走了\(d-1\)次后\(\sum_i\sum_ja(i,j)\)的值即为答案。

  • 第三档 50 发现可以把矩阵改为状态为\(state\)时在第\(i\)点到状态为\(state'\)时在\(j\)点的方案数,然而时间复杂度为\(O(n^32^{3k}\log d)\),仍然无法通过本题。

  • 第四档 100 发现状压和矩阵简直无法兼容,放弃状压,考虑容斥。直接封掉某些点再用矩阵计算。

代码网上有。但是容斥推荐用\(for\)枚举,不要用\(dfs\),很慢


T3

贪心大师重出江湖!

转化题意发现我们就是要分配\((\sum n)+1\)\(+3\)操作给\((\sum n)+1\)个数,每个数最多被分配到两个,然后让某个指定数的排名尽量靠前。

显然的贪心策略:

  • 先给指定数\(+6\)

  • 再给指定数\(+6\)后仍然比指定数大的其它所有数全部加6,假设这种数有\(x\)个。当然如果已经加够了这么多次就可以停止直接输出答案为\(x\)

  • 给其它比指定数小的数加到刚好再多加一次就比指定数大的状态(假设指定数为now,即加到now或now-1或now-2),当然还是最多加6。这期间如果加够了答案也是\(x\)

  • 剩下的加法操作,每执行一次,当前数的排名就会加1,因此假设执行完这些操作后还有\(y\)次没有执行,答案即为\(x+y\)

这不是很简单吗?。。。。


T4

树上差分。模拟即可。无语。




2021.10.10

T1

发现\(n\)很小。

直接把居民这一行和他上面一行和下面一行以及这些列拿出来,离散化后变成一个新的网格图,这个网格图的大小一定是300以内的,直接跑最短路即可。理论时间复杂度约为\(n^3\log n^2\),但是会带一个10左右的大常数,不过跑不满,可以通过本题。


T2

数位DP入坟题。这里仅给出一种可行方法,不保证为最优方法。

\(f(i,j,k)\)\(i\)位数,最高位为\(j\),花费为\(k\)\(FC\)有多少个

那么我们有转移公式:

\[f(i,j,k)=\sum_{l=0}^{9} f(i-1,l,k-j) \]

下一步需要求出从\(1\)\(x\)有多少个花费为\(y\)\(FC\),用\(\text{getsum}(x,y)\)表示。

这个求法很显然。从高位到低位枚举即可。如果当前位为\(i\)时后面可以任取那就直接用\(f\)得到,否则就递归求\(\text{getsum}(x-1,y-i*10^{x-1})\)

于是我们可以通过前缀和相减得到\([L,R]\)中花费为\(y\)\(FC\)有多少个了。

最后枚举每一个花费即可求得答案。


T3

简单的数学题。

显然,如果一次只能掰一块,每一次操作会让总块数+1,因此要变成\(L\times W\times H\)就需要\(L\times W\times H-1\)次操作。

然而用刀割就不是了。显然,如果正确分配每一块的位置,每一次操作都可以让所有巧克力都变为两块,即总块数乘2。但是大小已经为1的就不能再分了。显然,对半分可以让大小尽量地均匀。因此最后就需要\(\lceil \log L \rceil+\lceil \log W \rceil+\lceil \log H \rceil\)次操作。


T4

这个是货真价实的多项式。。。

10分:直接计算,暴力取模。

30分:不需要写高精,边读边取模,使用龟速乘防止爆\(\text{long long}\)

30~60分:普通高精,利用秦九韶公式计算多项式,计算次数是\(n^2\)次。需要计算\(l\)个多项式。普通高精的乘法复杂度为\(O(m^2)\),故复杂度为\(O(n^2m^2l)\),大约是\(10^{10}\)

60分:压位高精:把9位压成一位,使得\(m\)可以变为\(\frac{1}{10}\),所以计算次数大约是\(10^8\),可以通过60分数据点。

60~80:显然,我们需要把乘法优化,这个时候就要请出我们的

\[\huge{F\color{red}{FT}} \]

把高精计算看作两个多项式\(\huge{卷积}\),利用FFT即可。时间复杂度为\(O(n^2lm\log m)\)

然而好像还是只有60。所以我们还需要更高明的算法。