两个半小时自信离场
\(70+0+100\)
A.老司机的汽油
考这玩意是不是多少沾点?
我们再看一眼这题的数据范围:
\(1<=n<=1000000,0<=a_i<=b_i<=10^{18}\)
long double 也无法存储这么大的数,所以我们不能先求和后平均;
而是每读入一个数,将其除 n 之后的数和除 n 的余数分别累加;
这两个累加之后都不会超过 long long 的范围;
除 n 得到的数一定只是对整数部分有贡献的;
余数再除 n,商累加到整数部分,余数/n 即为小数部分;
将余数乘 \(10^{12}\) 除 n,然后再用乘 \(10^{13}\) 次方的判断四舍五入的问题就可以了;
由于读入巨大建议使用读入优化,二者时间上差了一倍之多;
标程里的读入优化可供参考,建议自己实现一遍;
B.老司机的开车计划
跳重链时 \(Fa\) 数组写成了并查集的 \(fa\) 爆蛋了。
所以就给一个极弱的小样例有意思吗?
首先把边权从大到小排序建成 \(\text{kruskal}\) 重构树,对于一次查询我们在树上求得 \(x\) 和 \(y\) 的 \(\text{LCA}\),记其点权为 \(val\),答案就是 \(\sum\limits_{h_i\le val}h_i\),这个东西用树状数组维护即可。
C.老司机的小司姬
感觉有点奇妙。
设 \(f(n,op)(op\in{0,1,2,3})\) 为在原点朝向为 \(op\) 进行 \(n\) 次操作后的答案,\(X(n,op)\) 为原点朝向为 \(op\) 进行 \(n\) 次操作后的横坐标之和,同理可得 \(Y(n,op)\),于是有以下式子:
\(\begin{aligned}
f(n,0)&=S(f(n-1,0)+Y(n-1,0))+Lf(n-1,1)+Rf(n-1,3)\\
f(n,1)&=S(f(n-1,1)+X(n-1,1))+Lf(n-1,2)+Rf(n-1,0)\\
f(n,2)&=S(f(n-1,2)-Y(n-1,2))+Lf(n-1,3)+Rf(n-1,1)\\
f(n,3)&=S(f(n-1,3)-X(n-1,3))+Lf(n-1,0)+Rf(n-1,2)\\
X(n,0)&=S(X(n-1,0)+(S+L+R)^{n-1})+LX(n-1,1)+RX(n-1,3)\\
X(n,1)&=SX(n-1,1)+LX(n-1,2)+RX(n-1,0)\\
X(n,2)&=S(X(n-1,2)-(S+L+R)^{n-1})+LX(n-1,3)+RX(n-1,1)\\
X(n,3)&=SX(n-1,3)+LX(n-1,0)+RX(n-1,2)\\
Y(n,0)&=SY(n-1,0)+LY(n-1,1)+RY(n-1,3)\\
Y(n,1)&=S(Y(n-1,1)+(S+L+R)^{n-1})+LY(n-1,2)+RY(n-1,0)\\
Y(n,2)&=SY(n-1,2)+LY(n-1,3)+RY(n-1,1)\\
Y(n,3)&=S(Y(n-1,3)-(S+L+R)^{n-1})+LY(n-1,0)+RY(n-1,2)\\
\end{aligned}\)
发现这个东西可以矩阵加速,于是有以下转移式子:
于是就做完了,通过观察会发现有很多项本质相同(相等或互为相反数),所以可以把矩阵压缩一下,但是感觉没啥必要,已经能过了。