https://atcoder.jp/contests/abc355

E - Guess the Sum

交互题

有隐藏数组 a[0,2^n-1]

每次只能询问 sum a[2^i * j,2^i *(j+1)] mod 100

sum a[l..r] % 100

要求 询问次数最小

我的思路

首先 进行 二进制拆解有一个方案是

1
2
3
4
5
6
7
8
9
query(l,r,ql,qr,i,j):
assert(l <= ql and qr <= r)
if(l == ql and qr == r) return ask(i,j);
m = (l+r)/2
if(ql < m) ret += query(l,m,ql,min(m,qr),i-1,j*2)
if(qr > m) ret += query(m,r,max(m,ql),qr,i-1,j*2+1)
return ret

ans = query(0,1 << n,l,r,n,0)

这个问题是 不能保证最小次数

例如 求a[0..14],那么 只需要 a[0..15] - a[15..15] 两次 而不是3次

这个从二进制上看单侧

14 = 1110, 也就是连续的最多需要两次可以计算出

所以想的是 l 的二进制 变为 r的二进制过程中, 只能 加 或 减 2的幂次,且幂次不能超过当前值的最高位的1

所以 l,r的高位相同的地方忽略掉,处理低不同的位 例如1100 -> 1110,高位1100相同,只用考虑00->10

所以贪心吗,感觉”实现题”写着都好难受

閱讀全文 »

https://atcoder.jp/contests/abc354

G - Select Strings

n个字符串si,每个字符串有价值ai,选一个字符串集合,使得集合中两两没有子串(连续)关系, 求最大价值和

n 100

sum |si| 5000

ai [1,1e9]

2s

1024mb

我的思路

这字符串可以 kmp si#s0#s1#s2.. 计算出 是否是子串关系

但之后怎么求不知道了

如果是依赖的选择 可以转化成 网络流

这里是互斥的选择

閱讀全文 »

https://atcoder.jp/contests/abc351

G - Hash on Tree

给定n点树有根数

值数组a[n]

f(u) = a[u] , 如果u是叶子

f(u) = a[u] + prod f(child of u)如果u非叶子

q次操作,每次 修改 a[pos]=val,每次修改后输出 f(1)

n,q 2e5

4s

1024mb

我的思路

首先这个是收到深度控制的,如果暴力的更新的话

那么一个想法是能否flat掉这个行为

[a,b,c]x[x,y,1] = [0,a*1+b*y,1]

leaf = [0,ai,1]

非叶子 = [ai,1,0]

然而没找到 矩阵方法或者满足“结合率”的东西

如果能有 矩阵或者结合律满足,就是个线段树维护,就好了

其中 上面的乘还可以拆成左右的包裹,总之如果有办法就好了

但是在尝试中发现要得到 a1+by 这种总是伴随秩的下降,没啥办法


第二个想的是上生成方程, 也没有弄出东西


那么最后就是 能否树的结构通过 轻重链 来完成快速计算(q log n)? 也没想到具体维护方法

閱讀全文 »

https://codeforces.com/contest/1951

G Clacking Balls(2s,256mb)

1~m篮子 顺时针 环

n个球,第i个在 篮子ai中,每个篮子至多1个球

alice 可以进行1s操作

  • [1,n]等概率 选i
  • 如果 球已经不存在,则跳过(依然耗时)
  • 如果 球存在,则沿着把球顺时针移动一个篮子,(如果目标篮子有球,把目标篮子中原来的球抛弃)

直到只剩下一个球停止,求操作时间的期望值 mod 1e9+7

n 3e5

n,m 1e9

我的思路

不能说没有想法,只能说一点想法也没有

如果一个球消失,那么说明有前面的球超过了它,换个角度 如果 球i移动 导致球j消失,也就是i走到j的位置,那么换成i消失是等价的后续,不影响概率

所以转换了题意的第三条(谁移动谁消失)以后

如果说 最后剩下的是 第i个球,那么这个球没有触碰下一个球,而前面的所有球触碰了后一个球

所以是个min/max 容斥+期望 吗?

计算每个球的 消失(触碰后面球)的期望次数,再min-max 容斥掉?

感觉也不对

再换个角度, 如果i留下

1
[i-1 ................i] .....

没啥想法,总的来说,显然直接状态描述肯定不行的,不论是点坐标还是距离

那么要么就是孤立每个 间隔的期望什么的,要么就是孤立的什么点期望,总之需要一个办法把其中 关联的东西拆掉,

而且不只如此,还有环


然后就是考虑简化的问题, 同样是环,但是只有两个点

那么 Exp(state) = Exp(点的距离)

然而转化构成了 一个转化矩阵

$A\lambda=\lambda$的形式,已知$A$要求$\lambda$


另一个是展开环到无限的数轴,指定目标点,那么得到每个点的移动方案数?

閱讀全文 »

https://codeforces.com/contest/1942

E. Farm Game(2s,256mb)

在 区间[1,l]整数点上 放 ABABAB…或者BABABA… 一共n组AB或BA, 坐标不一定相邻

  • 玩家X可以选择任意多个X(和玩家ID相同),和一个方向(左或右),把所有选中的A沿着这个方向移动
  • A先B后
  • 移动过程中字母不能重叠 不能出[1,l]范围,如果无法移动则输掉

问 给定$l,n$ 有多少个初始状态 玩家A获胜

我的思路

很像nim的游戏之类的

那么考虑 每个AB之间的空位的和,如果空位和为奇数,那么总可以移动那个位置让AB之间的空位和减1,而对于空位和是偶数,不一定能增大,也不一定能减少,但只要是能操作则结果也是奇数,

如果一轮操作后 空位和不变(否则变小),那么对应位置整体向同一个方向移动了两个字母

所以 获胜状态 = 所有AB间隔 空隙和=奇数

那么 l个位置 去掉 2n个占用位置,实际是切割成2n+1个 >=0 的段

也就是 l-2n长度线段切割成 2n+1个 >=0整数段 且 偶数index的段的长度和=奇数

考虑所有段+1

(l-2n)+(2n+1) 段 切割成 2n+1个 >=1 整数段,且偶数index的段的长度和 = 奇数+n

考虑 做顺序的置换,把所有偶数index段直接移动到最前,则方案还是一一对应

(l-2n)+(2n+1) 段 切割成 2n+1个 >=1 整数段,且前n段的长度和 = 奇数+n

1
2
3
4
5
6
for 前n段的长度和 = i:
if i % 2 == (n+1) % 2:
ans += (i 切割 n)段 * (l+1-i 切割成 n+1) 段, 每个切割段 >=1

长度 x 切割成y个>=1整数段,相当于 x-1个切割点中选择y-1个切割点
cut(x,y) = binom(x-1,y-1)

最后答案 AB和BA反向需要乘上2

然而 pretest1都没过 https://codeforces.com/contest/1942/submission/256178349


然后我发现读错题了,是 一次可以移动任意多个同方向,而不是一次一个

那么思路也完全一样,就是 去挤压另一个

所以 如果 存在 > 0 个奇数空位,则A 总能 把这些 奇数空位全变偶数(0个奇数空位)

如果 存在 0 个奇数空位,则全为偶数空位,则操作不确定,且操作后至少一个奇数空位

所以 方案 = 所有方案 - 全偶数空位方案

一样的

l-2n个位置切割2n+1个>=0整段,其中偶数index的长度全偶数

(l-2n)+(2n+1)=l+1个位置切割2n+1个>=1整段,其中偶数index的长度全奇数

l+1个位置切割2n+1个>=1整段,其中前n段的长度全奇数

1
2
3
4
5
6
7
for 前n段长度和为i, i % 2 = n * 1 % 2:
把 前n段每个长度+1, 则 前半
i+n长度 切割成 n 个 >= 2的偶数段 (那么每2个看成一个)
(i+n)/2 长度 切割成 n 个 >= 1的整数段
也就是 cut((i+n)/2,n)
cnt += cut((i+n)/2,n)*cut(l+1-i,n+1)

ans = (binom(l,2n)-cnt)*2

https://codeforces.com/contest/1942/submission/256179100

閱讀全文 »
0%