题目链接:https://ac.nowcoder.com/acm/contest/3979
B - 密码学
总结:看了一下题目,突然很好奇队友是怎么这么快过的,要是我写的话好像只会搞个高斯消元了。
队友的做法
把所有的修改操作离线,然后倒序所有的修改,因为每次操作的形式是:把第 \(x\) 行的数全部加给第 \(y\) 行,换言之就是 \(y'=x+y\) 。那么执行撤销操作就需要 \(y=y'-x\) 。
高斯消元的做法
每列是独立的,并且每列的变换矩阵还是同一个。单独抽出其中一列,比如只有2个元素。一开始的矩阵为单位矩阵,即每个元素只被自己影响。
\(\quad \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \quad\)
把第1行加给第2行:
\(\quad \begin{bmatrix} 1 & 0 \\ 1 & 1 \end{bmatrix} \quad\)
然后把最后的结果 \(('P'=41, 'Q'=42)\)
\(\quad \begin{bmatrix} 41 \\ 42 \end{bmatrix} \quad\)
作为常数接在右边,构成增广矩阵
\(\quad \begin{bmatrix} 1 & 0 & | & 41 \\ 1 & 1 & | & 42 \end{bmatrix} \quad\)
调用高斯消元接口就可以解出每个变量的值。
解一个增广矩阵的复杂度为 \(O(n^3)\) ,共 \(n\) 个增广矩阵,总复杂度为 \(O(n^4)\) 。但是对于同一个系数矩阵,配上不同常数项形成的增广矩阵,可以使用LU分解法,分解复杂度 $O(n^3) ,回代消元复杂度 \(O(n^2)\) ,总复杂度为 \(O(n^3)\) .
H - 最大公约数
打表题,打表可以发现结果,jls也有讲详细的证明。
F - 乘法
题解:给其中一维排序,然后二分答案x,再 \(O(nlogn)\) 统计有多少个比x小的。记得分正负数讨论,最好的办法是把正数和负数分开存。
I - K小数查询
jls的数据结构题。
A - 期望逆序对
昨天(2020/1/30)的Codeforces刚刚出?统计的方法有点点不同。