其他-一段时间的记录 (15 Oct - 07 Nov, 2018)

10.15

看课件。写了一下 Miller Robin 素数判定,发现以前代码写错了,两个 for 循环用的同一个变量名;而且类似蒙哥马利的那个快速(慢速)乘法实在太慢了,正确写法是 newuser 大佬的:

ll mul(ll a, ll b, ll n)
{
	LL t = a * b - SC(ll, SC(ld, a) * b / n + 0.5) * n;
	return t < 0 ? t + n : t;
}

还有就是测试素数还是要把 \([1,50]\) 之间的取完吧,不然可能会出错。

10.16

概率专练。贝叶斯,全概率,感觉很显然,真正做题的时候都是根据常识写而并不会想公式之类的……

被一道概率题坑了,有向无环图手构数据的时候注意:

  1. 要有起点不能到,但可以到终点的点。
  2. 要有可以到起点的点。
  3. 要有几个入度不等于出都的点。

还有就是全概率公式用的时候注意注意事件和子事件必须是包含关系,而且子事件必须互斥。
概率正推,期望倒推是真的有用 Orz 。

算期望,比如 \(A\) 能转移到 \(B,C\)\(W(A) = W(B) \cdot P(B|A) + W(C) \cdot P(C|A)\) ,所以是倒推。
算概率, \(P(B) = P(A) \cdot P(B|A)\) ,所以是正推。

10.17

数论训练赛

10.18

啥也没干,改昨天的代码。运动会,天气糟糕,打球还伤到了指甲,好气诶。实在太颓废了,明天改正(真香!)

10.23

前几天比赛倍增开爆数组,把 \(x+v_x\) 看成 \(x+v_x \cdot x\) ,考砸了两场训练赛 Orz 。
今天写了发哈希+二分。

10.24

A. Fibonacci

没有看见 \(f(0) = 0, f(1) = 1\) ,以为是自己想的那种 Fibonacci ,就跪了。第三次看错题啦,上次好像强行把一次函数看成指数级函数 Orz 。

B. 一样远

LCA ,再用节点 siz 处理一下。

C. 拆网线

不要被树上 DP 误导,和什么“监管警察”那道题也没有一点关系。考虑贪心,尽量多找仅一条边连接的两个点组成的二元组,或者把这个过程用 DP 模拟出来也行。

改悔

别看错题了 Orz ……
别想多了啊,比较恶心的题做不出来时考虑换换思路,比如贪心,或者猜结论之类的。


10.27

A. 蒜头君打地鼠

旋转 \(45^\circ\) 然后就是裸的二维前缀和,考试时写了个记录 V 字型区域的前缀和,结果边界写错,折腾了很久才调正确(就是类似一维前缀和时, \(sum(t) = sum(n)\ (t>n)\) 这种边界限制)。

B. 蒜头君的树

题目大意:求树上路径权值和。
大概是经典问题。考虑边对答案的贡献是 \(w \cdot size(x) \cdot size(n-x)\)

C. 蒜头君的坐骑

\(f(x,y,k)\) 表示在 \((x, y)\) 用了 \(k\) 次技能时受到的最小伤害。刷表法从现在向未来贡献,这个过程可以预处理,不过直接 dfs 的效率和预处理差不多,写起来更简单吧。类似的 dfs 刷表贡献的题,好像有一道是用“L”形状的积木填满棋盘,求方案数。学会了这种刷表操作之后, DP 状态还是比较显然(吧…… OrzOrz)。

改悔

考虑周全再写吧……A 题前缀和细节写错差点爆 0 。


10.28

A. 蒜头君的兔子

\(f(i) = f(i - 1) + f(i - 2) - f(i - 11)\) ,蒟蒻乘法优化一下即可。

B. 蒜头君的排序

区间询问其实就是求区间逆序对数。莫队套一个数据结构维护下。或者也可以写线段树合并。

C. 营救

\(f(i,s)\) 表示在 \(i\) 位置(一定是村民的位置或者起/终点), 村民处于 \(s\) 状态(三进制数, [0 正被背着, 1 已放到终点, 2 在原位置] )。预处理两点(一定是村民的位置或者起/终点)间最短距离,然后转移一下 DP 方程就可以了。

有点繁琐。

改悔

A 题记得类似的问题就是个裸的 fibonacci ,然后不会推 owo 。强行暴力 DP ,打表找规律找了两个小时,成功在一棵树上吊死。
因为 A 题写完时间不多啦,B 题写得非常暴躁,结果莫队排序左端点块号作为第一关键字,右端点位置作为第二关键字正好被我写反了……刺激!
C 题二十分钟没打出来,然后这场比赛就爆炸了。

感觉这段时间几场比赛都是 A 题签到题老是失智,时间分配完全失衡……其实一个小时左右的时候也意识到时间上出问题了,但感觉 A 题不做出来血亏,就一直耗,果然不出所料炸了。
正确操作大概是暂时跳过 A ,出去玩耍一下或者切一道题看吧 Orz 。

我,1218,下一场比赛,就是死,从这里……也绝对不可能在 A 题上耗死!


10.29

A. Starkの方程式

模拟。注意可以存在 A(BCD)E 这种右边无系数的括号。

B. 塔达林与游骑兵

状压 DP 即可。

C. Stark与Riga的卡牌游戏

改悔

A 题化学太差差点以为 ABCDE4 中的 4 会对前面所有字母都贡献,被样例卡住之后又调了很久才调过,做完已经大概耗了 3h 了。一开始通看题目的时候没看懂 B , 3h 之后看懂题发现很水,和以前做过的题类似, 20min 敲不出来。

爆零了 Orz 。因为 Linux 下面换行符 '\r' 的缘故,我写的 '\n' 。直接判不是合法字符(数字,字母,括号)就好了,可以有 60 分。被卡掉 40 分是由于由于有的括号右边并没有系数,应该默认系数为 1 特判一下。


11.01

A. 炸弹

从一个点向可以引爆的区间的其它点连边,缩点之后 DP 。但这样边数是 \(n^2\) 级别的。考虑到是区间连边,可以线段树优化建图。

另外,更好的解法是从每个点右边和左边第一个可以引爆它自己的点,向自己连一条边。这样的图和线段树方法建的图是等价的。

B. 相亲

神仙递推。

C. 奥数

预处理可以放在一起的集合,状态 DP 。

改悔

A 题猜了单调队列和贪心,搞了很久暴力都没写。一开始还看错了题直接前缀和乱搞。大概教训就是前面时间快速看下题、想好再写、只有四十分钟左右的时候先写个暴力保命。


11.07

C. 斐波那契

解法一

求出通项,线段树维护形如 \(a \cdot p^n + b \cdot q^n\) 的函数。

解法二

对于类似的数列 \(h(n) = h(n-2) + h(n-1)\) ,可以发现

\[\sum_{i=1}^{n}h(i) = h(n+2) - h(2) \]

同时还可以发现

\[h(n) = f(n-2) \cdot h(1) +f(n-1) \cdot h(2) \]

也就是说只要知道 \(h(1), h(2)\) ,预处理出 \(f(i)\) ,就可以 \(O(1)\) 得到 \(\sum h(i)\) 的值。

线段树维护,记录不同的 \(h(1), h(2)\) ,这样显然比较容易下放 tag ,就可以了。

解法三

分块。先差分一下,那么每次修改变成 \(O(1)\) ,每次询问需要 \(O(n)\) 求和。考虑不但对区间,还对数据分块,即每 \(k\) 次修改之后强行把序列求和复原一下。询问的话,对未复原状态(还处于差分状态)的区间暴力求和,对已复原的直接取值即可。

posted @ 2018-10-24 22:16  derchg  阅读(220)  评论(0编辑  收藏  举报