https://codeforces.com/contest/1943

D1,D2 Counting Is Fun

如果数组 每次可以 选择连续长度大于1的区间 同时减去1,操作多次以后 所有值变为0,则该数组是好(good)数组

对于 长度n,值范围[0,k]的 $(1+k)^n$个数组有多少个是好数组 $\mod p$

n D1(400),D2(3000)

$\sum n^2$, D1(2e5),D2(1e7)

$k \le n$

$p\in[10^8,10^9]$ 是质数

3s

1024mb

我的思路

good的充要条件?

首先 两端 不大于a1

如果出现连续3个$a < b > c$

要$b-a\le c$ (b,c同时下降 直到b变为a)或$b-c\le a$ (a,b同时下降 直到b变为c)

都是$b\le a+c$

所以 如果good 一定满足 上面的 两端 和 单峰的条件


那么如果满足 两端 和 单峰条件

对于单峰从左到右, 下降,每个前面的不影响后面的,

因此 这个条件是充要


就dp吧

dp[i][x][y]=i-1个位置合法,第i-1个位置是x,后一个是y的方案数

从第二项开始

然后 ans = sum dp[n][>=x][x]

对于$x\le y$

dp[i+1][x][y] = sum dp[i][...][x]

对于$x > y$

dp[i+1][x][y] = (sum dp[i][t][x], x <= t+y )=sum dp[i][>=x-y][x]

所以

dp[i+1][x][y] = sum dp[i][>=x-y][x], 其中 dp[i][<0][x]=0

用 后缀和可以 均摊 O(1) 计算每个x,y

所以有一个 $n n^2$的方法,感觉能过D1, 然后D2 明显TLE


感觉就是需要再次优化效率,然而上面的似乎并不能nxn的矩阵的矩阵乘法

然而 并没有成功优化

閱讀全文 »

https://atcoder.jp/contests/abc345

E - Colorful Subsequence

n个球 一排,有价值vi,颜色ci

问 恰好删除k 个且 剩余球 相邻不同色,vi和最大值

或不可能输出-1

n 2e5

k 500

v [1,1e9]

5s

1024mb

我的思路

可行性,首先同色连续t个,那么至少删除t-1个,那么留最大的

做完操作后满足了 相邻不同色,再看 恰好删除k个

只需要从两侧删除就可以满足恰好k个了

所以先处理所有连续 变为不同色


然后 不知道怎么搞,感觉需要 nk的复杂度的, 但只想到 nk2的

dp[i][t] = 前i个第i个保留,一共删除t个且合法的最优方案

dp[i][t] = a[i] + max(dp[i-1-d][t-d]) 表示从i-1向前连续删除了 d个的方案, 其中 c[i] != c[i-1-d]

处理边界只需要 两端塞入 {v=0,c=max color+1/+2} 即可

然而上面是 nk的状态 和 k倍的转移代价,所以时间上是 nk2的


两端塞了以后 0 [1...n] 0

ans = dp[n+1][k] = f[n+1][n+1-k]


一个想法是

dp[i][0<=t<=i] = f[i][i-t]

f[i][i-t] = a[i] + max(f[i-1-d][i-1-t]), a[i] != a[i-1-d]

还是不知道怎么处理这个不等,而且 这样转换的话,第二个维度的值会很大

但 如果对应到 二维 定义域平面上的话

1
2
3
4
5
6
7
8
            x
x
x
x
t+ x
^ x
| x
-> i+

其中

a[i]!=a[i-1-d] 的处理????

閱讀全文 »

https://ac.nowcoder.com/acm/contest/76652

D S 老师的虚树

给n点定树T,有颜色

对于 点集S,包含点集S的最小连通点集V’对应的树为生成树T’

w(S)=T’中不同颜色边个数

对于 i=1..n

计算 |S|=i的w的期望Exp(w(S)),结果mod 998244353

n 2e5

2s

512mb

我的思路

感觉就是算贡献,对于点为i的 点集合,对于颜色c的所有边来说,如果有横跨 边的两个点,那么贡献1,否则贡献0

那么考虑不跨边更简单,也就是 贡献i,c=所有情况 - 不跨边

$= \binom{n}{i}-\sum_{blk_j} \binom{blk_j}{i}$ 其中 blk是按照指定颜色切割的块

那么 $ans_i= C\binom{n}{i}-\sum_{blk_j} \binom{blk_j}{i}$,其中C是颜色总个数,blk是所有颜色独立的切割

那么问题来了,每个颜色切割的块数 = 当前颜色边数+1,

所以右侧有 n+C<=2n, 但是直接计算,对于每个i来说复杂度也是 $O(n)$的,总的复杂度会tle


生成函数我也想过没想过怎么简化

閱讀全文 »

https://atcoder.jp/contests/abc344

F - Earn to Advance

n x n的各自,要左上 走到右下, 每次 向右/向下/原地

移动需要花费 对应的 代价 R[i,j] D[i,j]

原地,获得金币p[i,j]

初始0元,过程保证金币非负,求最少 操作次数

n 80

r[i,j],d[i,j],p[i,j] 1e9

4s

1024mb

我的思路

直接的感觉就是dp,但是状态和转移不知道怎么设计

dp[i][j][coin] = t 在位置i,j剩余金币是coin的最小次数

然而这个coin的范围很大

换一个就是 dp[i][j][t] = coin, 而次数也可能很大


再想就是 如果当前在 [i][j] 那么 当前剩余金币coin 能移动到 [ni,nj]

而且 p[ni,nj] > p[i][j]

那么 如果 要从i,j 贡献到 ni,nj(因为也可能不去ni,nj), 那么一定不会在i,j停留,因为, 把同样停留次数在 ni,nj 上用,可以同样总次数,而总coin更多

从而 移动一定是从 p[i][j] -> 更大的p, 最后到终点


二分总次数好像也不可行

閱讀全文 »

https://codeforces.com/contest/1936

D. Bitwise Paradox

对于给定$v$

长度$n$,正整数数组$a,b$

对于$[l,r]$若 $b_l | b_{l+1} | \cdots | b_r \ge v$, 则称区间$[l,r]$是好的,其中运算符是 bitwise or运算

区间美丽值$beauty([l,r])=\max(a_l,a_{l+1},\cdots,a_r)$ 且区间是 好的,否则为$\infty$

q个询问,两种操作

  • 单点修改b, $b_i=x$
  • 询问$[l,r]$的所有子区间中 最小的美丽值(好的子区间中最小的美丽值)

n,q 2e5

$a_i,b_i,v \in [1,10^9]$

5s

1024mb

我的思路

首先b是控制是否good, 而a是控制beauty的最大值的

先是想如果没有操作就是询问

那么注意到 最这[l,r] 增大 bitwise or 非严格单调递增,同时beauty也非严格单调递增

所以想for l=1..n, 对于每个 l 找最小的r使得它是good 的,

那么 对于[ql,qr],如果ql <= l, 那么以l为子区间左端点的贡献就是 最小的r,包裹起来的 a的max

因为 如果 qr < r,说明以$l$为起点的 任何区间都非good,无贡献,

如果qr>=r,说明l作为子区间左端点时,有且只有r..qr作为子区间右端点的贡献,而r是一定非严格最小的,所以r+1..qr不会有额外贡献

所以 可以预先处理成 [i]=>[r,max]

计算r就是 直接 做bit拆分的 每个bit求和 做比较, n logV复杂度,r随着i增加非严格单调递增,max是丢个优先队列,能同步完成的


那么查询就是 [ql,qr] 中 所有 min(max) |{r <= qr,max}

这可能要离线莫队

然后如果把上面n个 [l,r,max] 看成n次操作的话

那么实际上是二维平面里 [<=l, >=r]的地方 做了val=min(val,max)的运算

也可以 2d seg tree


然后问题来了,现在虽然不改动a,但是要改动$b_i=x$

而一个bi 将 影响那些 l <= i <=r

这样 修改的 [l,r,max] 就是多个了

没想到怎么维护

閱讀全文 »
0%