T1

100%

用循环枚举 i=1n2i=1\sim n-2,判断 Ai>Ai+1A_i>A_{i+1}Ai+1>Ai+2A_{i+1}>A_{i+2} 是否同时成立,如果同时成立那么答案增加 11

时间复杂度 O(n)O(n)

T2

100%

最优策略为让高位的数字尽可能大。

从高位到低位确定答案的每一位,维护剩余位的数位和 nownow,初始 now=mnow=m

  • 如果 now9now\geq 9,那么这一位最多选 99:先输出 99,然后 now=9now-=9
  • 否则这一位最多选 nownow:先输出nownow,然后 now=0now=0

时间复杂度 O(n)O(n)

T3

100%

用一个 char\text{char} 数组来模拟队列。用一个 bool\text{bool} 数组 f[i]f[i] 表示字母 ii 是否在队列中:f[i]=1f[i]=1 表示字母 ii 在队列中,f[i]=0f[i]=0 表示字母 ii 不在队列中。

循环枚举 i=1ni=1\sim n

  • 如果 f[s[i]]=0f[s[i]]=0,说明队列中没有字母 s[i]s[i],将 s[i]s[i] 添加到队列尾部;
  • 如果 f[s[i]]=1f[s[i]]=1,说明队列中有字母 s[i]s[i],需要将这两个 s[i]s[i] 以及中间的字母都消除:从队尾开始不断删除元素,直到删除了一个字母 s[i]s[i] 后停止。

将队列中的元素按从队首到队尾的顺序输出。

每个字母最多被添加一次,被删除一次。

时间复杂度 O(n)O(n)

T4

100%

aia_i从大到小的顺序排序后,最优方案即为:第 11 个支架用长度为 a1a_1a2×ma_{2\times m} 的木棍制作,第 22 个支架用长度为 a2a_2a2×m1a_{2\times m-1} 的木棍制作,以此类推。

因此枚举 i=1mi=1\sim m,答案为 min{ai×a2×m+1i}\min\{a_{i}\times a_{2\times m+1-i}\}

时间复杂度 O(nlog(n))O(n\log(n))

T5

20%

每个球有 kk 种颜色可选,因此初始情况共有 knk^n 种。

只要初始情况中存在至少一个颜色为 11 的球,最终就能够合成出颜色为 11 的球。

反过来,只有当初始情况中所有球的颜色都不为 11 时,最终不能够合成出颜色为 11 的球。此时每个球只有 2k2\sim kk1k-1 种颜色可选,因此这类初始情况共有 (k1)n(k-1)^n 种。

用循环分别求出 knk^n(k1)n(k-1)^n,答案即为 kn(k1)nk^n-(k-1)^n

注意取模。

时间复杂度 O(n)O(n)

60%

用快速幂分别求出 knk^n(k1)n(k-1)^n 即可。

时间复杂度 O(log(n))O(\log(n))

100%

因为模数 P=998244353P=998244353 是一个质数,根据费马小定理,aP1modP=1a^{P-1}\mod P=1,其中 aa 是任意和 PP 互质的整数。

kkk1k-1 都与 998244353998244353 互质,因此 knmodP=knmod(P1)modPk^n\mod P=k^{n\mod (P-1)}\mod P(k1)nmodP=(k1)nmod(P1)modP(k-1)^n\mod P=(k-1)^{n\mod (P-1)}\mod P

先求出 y=nmod(P1)y=n\mod (P-1),再用快速幂分别求出 kyk^y(k1)y(k-1)^y,答案即为 ky(k1)yk^y-(k-1)^y

时间复杂度 O(log(n))O(\log(n))

T6

20%

定义 dp[i][j]dp[i][j] 表示只考虑前 ii 道题,共回答了 jj 道题且其中包括了第 ii 道题的最大总得分。初始时只有 dp[0][0]=0dp[0][0]=0,其余都为负无穷。

定义函数 f(i)f(i) 表示连续跳过 ii 道题会扣多少分:

  • 如果 iki\leq k,那么每道题扣 bb 分,f(i)=b×if(i)=b\times i
  • 否则前 kk 道题每道扣 bb 分,剩余 iki-k 道题每道扣 cc 分,f(i)=b×k+c×(ik)f(i)=b\times k+c\times (i-k)

考虑如何计算 dp[i][j]dp[i][j],假设上一次回答的问题是第 xx 道题,三重循环进行转移:

  • 第一重循环枚举 i=1ni=1\sim n,第二重循环枚举 j=1mj=1\sim m,求 dp[i][j]dp[i][j]
  • 第三重循环枚举 x=0i1x=0\sim i-1
  • 此时前 xx 道题中回答了 j1j-1 道,然后连续跳过 ix1i-x-1 道题,再答对第 ii 道题得 aia_i 分,转移为 dp[i][j]=max{dp[x][j1]+aif(ix1)}dp[i][j]=\max\{dp[x][j-1]+a_i-f(i-x-1)\}

最后一次答题后可能还会跳过题目,为了便于计算可以虚构出第 n+1n+1 道题,an+1=0a_{n+1}=0。答案即为 dp[n+1][m+1]dp[n+1][m+1]

时间复杂度 O(n2m)O(n^2m)

30%

对于测试点#4,因为 b=cb=c,所以 f(i)=b×if(i)=b\times i

在第一部分基础上,考虑求 dp[i][j]dp[i][j] 的转移,此时 i,ji,j 视为固定值

  • $dp[x][j-1]+a_i-f(i-x-1)=a_i-b\times (i-1)+dp[x][j-1]+c\times x$,其中 aib×(i1)a_i-b\times (i-1) 为固定值,dp[x][j1]+c×xdp[x][j-1]+c\times x 只和 xx 有关,因此维护 g[i][j]=maxyi{dp[y][j]+c×y}g[i][j]=\max_{y\leq i}\{dp[y][j]+c\times y\},转移为 dp[i][j]=max{aib×(i1)+g[i1][j1]}dp[i][j]=\max\{a_i-b\times (i-1)+g[i-1][j-1]\}
  • 计算完 dp[i][j]dp[i][j] 后更新 g[i][j]=max(g[i1][j],dp[i][j]+c×i)g[i][j]=\max(g[i-1][j],dp[i][j]+c\times i)

时间复杂度 O(nm)O(nm)

结合第一部分可以拿到 30%30\% 的分数。

40%

对于测试点#3,因为 k=1k=1,所以除了 f(0)=0f(0)=0 之外,对于 i1i\geq 1f(i)=b+c×(i1)f(i)=b+c\times (i-1)

在第二部分基础上稍加修改:

  • 如果 x=i1x=i-1,转移为 dp[i][j]=max{dp[i1][j1]+ai}dp[i][j]=\max\{dp[i-1][j-1]+a_i\}
  • 否则,$dp[x][j-1]+a_i-f(i-x-1)=a_i-b-c\times (i-2)+dp[x][j-1]+c\times x$,其中 aibc×(i2)a_i-b-c\times (i-2) 为固定值,dp[x][j1]+c×xdp[x][j-1]+c\times x 只和 xx 有关,转移为 dp[i][j]=max{aibc×(i2)+g[i2][j1]}dp[i][j]=\max\{a_i-b-c\times (i-2)+g[i-2][j-1]\}

时间复杂度 O(nm)O(nm)

结合第一、第二部分可以拿到 40%40\% 的分数。

100%

对于 i<ki<kf(i)=b×if(i)=b\times i,对于 iki\geq kf(i)=b×k+c×(ik)f(i)=b\times k+c\times (i-k)

在第三部分的基础上,用单调队列处理 ikxi1i-k\leq x\leq i-1 的部分:

  • 如果 ikxi1i-k\leq x\leq i-1,$dp[x][j-1]+a_i-f(i-x-1)=a_i-b\times (i-1)+dp[x][j-1]+b\times x$,其中 aib×(i1)a_i-b\times (i-1) 为固定值,dp[x][j1]+b×xdp[x][j-1]+b\times x 只和 xx 有关,但由于要求 xikx\geq i-k,所以我们用单调队列维护这一部分,具体来说:
    • 单调队列 q[j]q[j] 内的元素 xx,对应第 jj 次回答的问题是第 xx 道题;
    • 保证队列内的元素 xx 满足 dp[x][j]+b×xdp[x][j]+b\times x 递减;
    • x<ikx<i-k 时令 xx 出队;
    • xxq[j1]q[j-1] 的队首元素 qxqxdp[x][j1]+b×xdp[x][j-1]+b\times x 取到最大值,转移为 $dp[i][j]=\max\{a_i-b\times (i-1)+dp[qx][j-1]+b\times qx\}$;
  • 否则,$dp[x][j-1]+a_i-f(i-x-1)=a_i-b\times k-c\times (i-k-1)+dp[x][j-1]+c\times x$,其中 aib×kc×(ik1)a_i-b\times k-c\times (i-k-1) 为固定值,dp[x][j1]+c×xdp[x][j-1]+c\times x 只和 xx 有关,转移为 $dp[i][j]=\max\{a_i- b \times k -c\times (i- k - 1)+g[i-k-1][j-1]\}$。

注意:因为 ikxi1i-k\leq x\leq i-1 时的转移要用到 q[j1]q[j-1],如果 jj 是从小到大枚举,需要在计算完所有 dp[i][j]dp[i][j] 之后,再把元素 ii 分别加到各个优先队列中。

时间复杂度 O(nm)O(nm)

0 comments

No comments so far...