杂题乱做2

广二的 NOI round 真不会做(4h=10pts),所以滚回来做些简单题。

「雅礼集训 2018 Day4」Cube

题目:https://loj.ac/p/6501

现在三年级都这么厉害了吗?

首先通过打表容易发现答案为 \(\operatorname{C}_n^m*\ 2^{n-m}\),然后快速幂+逆元就过了。

然后就结束了。

证明:考虑建立一个 \(1* 1*...* 1\)\(n\) 维几何体,再考虑建立一个 \(1* 1*...* 1\)\(m\) 维几何体,然后将这个 \(m\) 维几何体放到 \(n\) 维几何体中移动(感性理解一下,比如说平行于 \(z\) 轴的一根线段在正方体上平移到底边的四个顶点),每一个移动的位置就是一个答案。

\(n\) 维几何体的 \(n\) 个维度中要有 \(m\) 个维度来确定这一个 \(m\) 维几何体,通过不同的 \(m\) 个维度确定的 \(m\) 维几何体是不同的,比如说一个正方体上有上表面和右表面,两者不是相同的 \(2\) 个维度确定的,前者是通过 \(x\) 轴和 \(y\) 轴相交的平面构成的,后者是通过 \(x\) 轴和 \(z\) 轴相交的平面构成的。

剩下的 \(n-m\) 维每位可以取 \(0\)\(1\) ,共 \(2^{n-m}\) 种,所以答案为 \(\operatorname{C}_n^m*\ 2^{n-m}\)

ABC264F Monochromatic Path

考虑 dp ,但注意到每一行(或每一列)只能变 \(1\) 次,因此二维 dp 难以实现(例如某一行相邻的两个格子为不同颜色,那么在只变这一行的前提下无法完成),不妨设 \(f[i][j][op_1][op_2]\) 来表示走到 \((i,j)\) 的最小花费,以及第 \(i\) 行和第 \(j\) 列是否变色,若 \(op=1\) 代表已经变色,\(op=0\) 则相反。

那么就有以下转移:(实在不想写 \(\LaTeX\) 了)

now=col[x][y]^op1^op2,last=col[x][y-1]^op1;
if(now==last)f[x][y][op1][op2]=min(f[x][y][op1][op2],f[x][y-1][op1][0]+c[y]*op2);
else f[x][y][op1][op2]=min(f[x][y][op1][op2],f[x][y-1][op1][1]+c[y]*op2);
    
now=col[x][y]^op1^op2,last=col[x-1][y]^op2;
if(now==last)f[x][y][op1][op2]=min(f[x][y][op1][op2],f[x-1][y][0][op2]+r[x]*op1);
else f[x][y][op1][op2]=min(f[x][y][op1][op2],f[x-1][y][1][op2]+r[x]*op1);

计算代价时一定要注意有没有重复计算!

初值:

memset(f,63,sizeof f);
f[1][1][0][0]=0;
f[1][1][0][1]=c[1];
f[1][1][1][0]=r[1];
f[1][1][1][1]=r[1]+c[1];

答案:\(\max(f[n][m][op_1][op_2])\)

然后就没有然后了,时间复杂度为 \(O(nm)\)

ABC264Ex Perfect Binary Tree

不要问为什么没有 G,因为 G 还没有改出来。

再一次考虑 dp,可以设 \(f[i][dep]\) 表示以 \(i\) 为根,深度为 \(dep\) 的完美二叉树数量,注意到对于某个父节点的两个儿子都是深度为 \(dep\) 的完美二叉树时,再加上该父节点同样是一棵深度为 \(dep+1\) 的完美二叉树。

每读入一个节点就考虑向根节点更新答案,那么就有转移:

\[f[v][dep]+=\sum_{son\in v\land son\not =u }f[son][dep-1]* u_{con} \]

其中 \(u\) 表示当前新增的 \(i\) 号节点所在的那个子树,\(u_{con}\) 表示新增这个节点后这棵子树新增的答案,根据乘法原理和加法原理,容易得出。

然后从 \(i\) 一直往上推即可,记得记一下每个点的父亲。

\(u_{con}\) 提出来,剩下的记一下每个节点的孩子 \(f\) 的和再减去 \(f[u]\) 即可。

时间复杂度为 \(O(ndep)\) 不一定能过,但要注意一棵深度为 \(dep\) 完美二叉树有 \(2^{dep}-1\) 个节点,所以 \(dep\le \log n\),在本题中,所有深度大于 \(20\) 的节点都不可能更新答案,所以时间复杂度为 \(O(n\log n)\)

AGC058A Make it Zigzag

先满足第一个条件,那么此时有:

\[P_1<P_2,P_3<P_4,...,P_i<P_{i+1}(i=1,3,5,...) \]

然后再考虑第二个条件,如果找到 \(P_i<P_{i+1}(i=2,4,6,...)\) 即不满足条件,那么可以直接交换 \(P_i,P_{i+1}\),因为根据之前的第一个条件有 \(P_{i-1}<P_i<P_{i+1}<P_{i+2}(i=2,4,6,...)\),交换后变成 \(P_{i-1}<P_{i+1}>P_i<P_{i+2}(i=2,4,6,...)\) 仍满足第一个条件。

代码两行:

for (int i = 1; i <= n * 2; i += 2) if (a[i] > a[i + 1]) ans[++tot]=i, swap(a[i], a[i + 1]);
for (int i = 2; i <= n * 2; i += 2) if (a[i] < a[i + 1]) ans[++tot]=i, swap(a[i], a[i + 1]);

时间复杂度为 \(O(n)\)

B 的 dp 没看懂,哪位大佬可以来给我讲讲。。。。

「雅礼集训 2017 Day1」矩阵

首先我们可以得出:如果有某一个点是黑色,一定有解。因为我们可以通过 \(n\) 次复制使得某一行都变成黑色,然后再用 \(n\) 次复制使得所有列变成黑色。

但这样肯定不是最优解,所以在有解的情况下再来一步一步的推:

首先如果有某一行全部是黑色,那么答案就是存在白色的列的个数,因为只有某一行才能去更新某一列,每一个存在白色的列都要某一行去更新,并且每一列更新后不会影响其他列,当不存在白色的列时,这个矩阵都是黑色。

注意此时考虑行是没有意义的,因为只能通过行更新列,无法更新某一行。

但如果没有某一行全部是黑色,我们就要去构造一组全黑的行,因为如果用不是全黑的行去更新会造成更多白点,这些白点之后一定再会被某一个全黑的行来更新,那么之前的更新就是多余的。

不妨枚举某一行,假设考虑第 \(i\) 行,如果第 \(i\) 列存在黑点,那么可以通过将该黑点所在的那一行去更新第 \(i\) 行的每一列,每次可以更新一个白点,更新次数就是第 \(i\) 行白点的数量。

也就是说,假设黑点位置为 \((k,i)\) ,并且 \((i,j)\) 为白点,那么用第 \(k\) 行去更新 \(j\) 列会使得 \((i,j)\) 变成黑点。

如果第 \(i\) 列不存在黑点,那么可以通过这个矩阵上的另一个黑点(如果没有黑点那么一定无解)所在的一行去更新第 \(i\) 列,使其至少有一个黑点,只比上面的操作多了 \(1\) 步。

最后,在构造出全黑的一行后再看看当前白色的列的个数,时间复杂度为 \(O(n^2)\),写代码时一定要注意还原和更新后矩阵的改变。

「雅礼集训 2017 Day1」市场

直接用线段树维护,但操作 \(2\) 无法直接维护,但可以看出最多有 \(\log\) 次操作 \(2\) 区间就会变成 \(1\),所以我们可以直接暴力修改,统计一下区间最大值是否为 \(1\),如果是则直接不修改,这样大概可以拿 \(60\%\) 的分数。

考虑线段树维护的是区间,上面的做法过于浪费,所以观察区间数整除后的变化,将区间和减去变化的数就可以了,但前提是这个区间变化的数相同,才可以用标记记为一个数。

容易发现,如果 \(mx-\lfloor\frac {mx} d\rfloor=mn-\lfloor\frac {mn} d\rfloor\),那么这个区间变化的数都相同(极端情况满足那么中间的情况也肯定满足),这时候直接打标记并且退出即可,不必遍历这个区间。

时间复杂度为 $O( $ 宏学 \()\) ,经过我的观察,极端数据常数大概在 \(100\)\(300\),可以通过。

ABC268F

难度远小于 E,不开 F 真是可惜死了。

容易发现交换两个相邻的字符串对前后的答案没有影响。

所以直接 sort,考虑如何 cmp。

假设相邻的 \(A\)\(B\) 两个字符串,设 \(A\) 中能产生 \(w_A\) 的贡献,有 \(d_A\)X,所有数字和为 \(k_A\),同理设 \(B\) 中能产生 \(w_B\) 的贡献,有 \(d_B\)X,所有数字和为 \(k_B\),那么有:

  • \(A\)\(B\)\(w_A+w_B+d_A*k_B\)

  • \(B\)\(S\)\(w_A+w_B+d_B*k_A\)

所以比较一下 \(d_A*k_B\)\(d_B*k_A\) 即可。

posted @ 2022-09-13 14:44  xiaoPanda  阅读(84)  评论(2)    收藏  举报