寒假集训 思维题
HDU 7220
一个 \(01\) 串,可以翻转长为奇数的区间,求可能得到的最小字典序。
翻转只会在奇偶性相同的位置造成变化,只用长度为 \(3\) 的翻转,可以任意调换奇偶性相同的位置,那么将奇数位与偶数位分别排序即可。
一道数论题:
求 \(\sum_{i=1}^n\sum_{j=1}^m\min(\lfloor\frac{n}{i}\rfloor,\lfloor\frac{m}{j}\rfloor)[\gcd(i,j)=1]\)。
结论题,答案为 \(nm\)。考虑实际意义。枚举一个 \(n\times m\) 的平面内所有穿过整点的直线。只取 \([\gcd(i,j)=1]\) 防止直线被枚举两次,\(\min(\lfloor\frac{n}{i}\rfloor,\lfloor\frac{m}{j}\rfloor)\) 是这条直线过的整点数。那么每个点产生一的贡献,总共 \(nm\)。
一道图论题:
\(n\) 个点,点权 \(a_i\),将两个点相连的代价 \(cost_{i,j}\),要求连出一棵生成树使 \(\sum cost-\sum a_id_i\) 最小,其中 \(d_i\) 为点 \(i\) 的度。
连一条边花费 \(cost_{i,j}\),收益 \(a_i+a_j\),那么把点权放到边权上,将边权赋值为 \(cost_{i,j}-a_i-a_j\) 跑最小生成树即可。
一道贪心题:
一个 \(R\times C\) 的棋盘,有 \(n\) 个骑士在棋盘各处,每次可以让一个骑士走日字,骑士可以同时处于一个方格。最终要让 \(n\) 个骑士在两个不同的坐标汇合,每个点 \(\frac{n}{2}\) 个骑士,求最小步数。
先求点之间的最短路,枚举两个汇合点,设骑士到两个点的距离为 \(D_i,P_i\)。先假设全部汇合到第一个点,再按 \(P_i-D_i\) 排序,选出影响最小的放到第二个点。
JZOJ5432
给出 \(n\) 个三元组 \((x_i,y_i,z_i)\) 和三个整数 \(X,Y,Z\) 满足 \(X+Y+Z=n\),在每个三元组中选一个数,要求选 \(X\) 个 \(x_i\),\(Y\) 个 \(y_i\),\(Z\) 个 \(z_i\),求选出来的数的和的最大值。
考虑上一题的套路。假设全选 \(x_i\),变成从 \(n\) 个新二元组的 \((y_i-x_i,z_i-x_i)\) 中选 \(Y\) 个第一项,\(Z\) 个第二项,\(X\) 个不选,使价值最大。
设新二元组为 \((u_i,v_i)\)。按 \(u_i\) 降序排序,设最后一次选 \(u_i\) 的位置为 \(p\),则 \(1\sim p\) 不存在不选,否则把 \(p\) 的 \(u_i\) 换成前面不选的 \(u_i\) 更优。
前 \(p\) 个二元组,有 \(Y\) 个 \(u_i\),\(p-Y\) 个 \(v_i\),剩下 \(Z-p+Y\) 个 \(v_i\)。此时两个部分都容易用堆维护。
\(n\) 个任务,完成时间 \(T1_i\),截止时间 \(T2_i\),求完成的最大任务数。
优先做 \(T2\) 小的任务。但是可能出现一种情况:一个任务 \(T1\) 大,\(T2\) 小,做了这个任务使后面更多的任务不能做。
考虑反悔贪心,堆维护已经完成的任务中用时最长的,如果当前任务没时间,并且用时比堆顶的时间少,就用这个任务替换掉堆顶的任务。
\(M\) 的钱,\(N\) 个物品,有 \(K\) 张优惠券,对一个物品用优惠券可以使物品价格从 \(P_i\) 降到 \(C_i\),求最多能买多少物品。
首先,优惠价最小的 \(K\) 个物品一定会买。否则必然会有一个剩下的物品用优惠券买,用没买的前 \(K\) 个物品的优惠价替换更优。
假设前 \(K\) 个都用优惠券,买剩下的物品有两种可能:直接买 \(p_i\);反悔前面第 \(j\) 个物品的优惠券,花费 \(c_i+p_j-c_j\)。
开三个堆:没买的 \(p_i\) 和 \(c_i\),买过的且用了优惠券的 \(p_i-c_i\)。
\(n\) 个点,收益为 \(a_i\),要选 \(k\) 个,相邻的不能选,求最大收益。
反悔贪心典题,用双向链表维护。取了一个点之后删掉旁边两个点,这一个点的收益改为旁边两个点的收益与这个点的收益之差。
一个 \(01\) 串,连续段长度不超过二。每次可以翻转一个位置,需要保证连续段长度不超过二,求将起始状态变成目标状态的最小操作次数。
在 \(0,1\) 之间划一条红线,\(1,0\) 之间划一条蓝线,不难发现线红蓝相间,两条线的距离不超过二,一次操作是将一条线向左右移动。
枚举向左移除了多少条线,那么答案就是起始状态和目标状态对应的线的距离取 \(\min\)。
一道题:
\(N\) 个 \(M\) 位二进制数,求一个二进制数与这 \(M\) 个二进制数的相同位数的最大值最小。
BFS 可以求某个数到已知二进制数的不同位数,把这 \(N\) 个数扔进队列广搜即可。最大相同位数就是 \(M\) 减去最小不相同位数,取个 \(\min\) 即可。
一棵根为 \(1\) 的树,需要支持对某个节点打标记,查询有标记的最近祖先。
倒过来做,打标记变成删除标记。先遍历一次,求出每个点有标记的最近祖先,在并查集里面向这个祖先连边。
删除一个点的标记,那么这个点代表的点集都要往上找祖先,因此在并查集里向其父亲连边。查询的答案就是所在集合的祖先。
AcWing1315
一个网格,只能向上或向右走,不能穿过直线 \(y=x\),求 \((0,0)\) 到 \((n,m)\) 的路径数量。
把不合法路径沿着 \(y=x+1\) 对称,发现路径变成了 \((0,0)\) 到 \((m-1,n+1)\) 的任意一条路径,这两种路径形成双射。那么答案为 \(C_{n+m}^m-C_{n+m}^{m-1}\)。
求一个竞赛图(有向完全图)是否有三元环。
竞赛图的重要性质:竞赛图要么没环,要么存在三元环。
证明:假设一个 \(n\) 元环上有连续 \(a,b,c\) 三点。若 \(c\) 连向 \(a\),那么 \(a\to b\to c\to a\) 为三元环;否则 \(a\to c\rightsquigarrow a\) 为 \(N-1\) 元环。不断重复这个过程即可得到三元环。
找环乱搞即可。
[[杂项]]