Atcoder abc315
https://atcoder.jp/contests/abc315
G - Ai + Bj + Ck = X (1 <= i, j, k <= N)
给定a,b,c,x,n 找满足限制的方案数
n 1e6
a,b,c [1,1e9]
x 3e15
2s
1024mb
我的思路
显然 for i = 1..n, 剩余部分exgcd算一算
但是wa了17个点,感觉我的exgcd应该是overflow了
https://atcoder.jp/contests/abc315
给定a,b,c,x,n 找满足限制的方案数
n 1e6
a,b,c [1,1e9]
x 3e15
2s
1024mb
显然 for i = 1..n, 剩余部分exgcd算一算
但是wa了17个点,感觉我的exgcd应该是overflow了
https://atcoder.jp/contests/abc314
二维平面上 n条线段 两两无交点
求最小半径的实心圆,使得和所有线段至少一个交点
n 100
坐标 [0,1000]
2s
1024mb
显然计算几何
都知道 圆上3点 能确定圆
但 问题是 3点不一定是 线段的端点,还可能和线段相切
想法还是 O(N^3)选择线段
那还需要 O(N)做校验
而且 选线段以后 ,是相切还是端点,似乎可以延长做三角形?
3端点 -> 定圆
2端点+1相切?
1端点+2相切?
3相切 -> 延长的三角形内切圆
另一个想法是利用坐标[0,1000]很小
如果一个方案可行,那么该方案离最近的整数点距离不超过 $(1,1) =\sqrt{2}$ , 所以整点的圆的半径和最优解的半径差不超过$\sqrt{2}$ 所以整点圆的半径也整数,和最优解差距不超过$\sqrt{2} + 1$
1 | for i in 0...1000: |
这样的话是 1000*1000*100
感觉也不行
https://atcoder.jp/contests/abc313
n张卡,正面ai,背面bi,初始都是正面
m个机器,对应卡xj,yj,!!xj可能等于yj
如果一个机器启动 则1/2几率 翻转卡xj,否则翻转卡yj
启动机器的集合任意选择
问 所有的 启动机器的集合 的方案中 卡的和
的期望值最大是多少
n 40
ai,bi [1,1e4]
m 1e5
2s
1024mb
显然是个概率论的题
n 比较小,m中等,ai,bi中等
1 | 卡 a1 a2 a3 |
从频次的角度来看, 如果涉及到翻转,那么该位置的期望贡献就是 (a[i]+b[i])/2
如果不涉及翻转 那么期望贡献就是 a[i]
所以选取的集合 就算再多,也只和被激活的那些有关,和一个位置被选了几次无关
所以问题可以变为,基础 = sum ai,
di = (b[i]-a[i])/2
有一堆激活的pair可以任意选,
问 最大 di和为多少
把di 按照正(>=0),负(<0)分类
如果有 (+,+)的di pair则一定选, 如果有(-,-)一定不选
那么剩下的就是 (+,-)的
而这类如果 其中的+已经选了 则一定不选
所以变成了, 未被选的+,所有-
和很多(+,-)的问题
那么显然 至少一侧的个数 <= n/2 = 20
这就很像bitset了
如果 所有-的个数 <= n/2 那最简单, 就是贪心选掉所有(+,-)有-被选的正的里面的
如果 所有+的个数 <= n/2???
1 | (a0 10,b0 -5) |
只能说 最终被选的 -的个数肯定 <= n/2, 因为每个(+,-) 最多选一次
n-正 个中 选 <=正的方案数? 这有多大?
正=20时 2^20
正=19时 $2^{21}-\binom{21}{21}-\binom{21}{20}$
正=18时 $2^{22}-\binom{22}{22}-\binom{22}{21}-\binom{22}{20}-\binom{22}{19}$
1 | def binom(n,m): |
看输出 感觉 还是2s过不了
1 | 1 40 |
https://codeforces.com/contest/1854
想了半天,bitset就过了??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
卧槽 200000^2/64 = 6'2500'0000.0
也能跑进3秒的吗?
https://codeforces.com/contest/1854/submission/216347777
1 | #include <bits/stdc++.h> |
B
常数优化完全不会, n*bitset(n/64)
n = 2e5可以跑进3秒!?
有人rust的也是bitset, https://codeforces.com/contest/1854/submission/216290617
pypy: https://codeforces.com/contest/1854/submission/216353273
C
https://atcoder.jp/contests/abc312/tasks/abc312_h
N个字符串s[i]
1 | t = set<string> |
$\sum |S_i| \le 2\cdot 10^5$, 小写英文字母
2s
1024mb
如果不同字符串之间互不影响,那么相同si的ki对应的值就是1,2,4,5,6,7…
那么问题就是如果不同的字符串之间有影响
$k_i\cdot s_i = k_j\cdot s_j, s_i \neq s_j$
若$k_i = 1$,也就是 $s_i$会是$s_j$的重复序列, 首先重复序列的长度一定是 $s_i$长度的因数,这样可以 额外$O(|s_i| log|s_i|)$ 的把所有处理成
$(s_i,repeat)$ 的形式
根据字符串的循环结的理论,显然 一个字符串有一个最小循环单位,且其它循环都是它的倍数
1 | 引理 简单证明 |
若 $k_i,k_j$均不为1,且$gcd(k_i,k_j) = 1$,那么用到上面引理类似的
不失一般性,设 $|s_i| > |s_j|$
1 | [s_i......][s_i......][s_i......][s_i......][s_i.....] |
综上,首先把所有的字符串拆成最小循环节和repeat, 然后对所有 最小循环结做hash
似乎就没了