• atcoder regular contest 114


    做了四个题,ABCE。BC比较简单就不说了。主要说一下ADEF。

    A - Not coprime

    题目叙述

    \(n\) 个数,要找出最小数使得每个数都和这个数不互质。
    数的大小 \(\le 50\)

    题解

    一开始想网络流什么的去了。
    实际上直接 \(2^{c}\)(其中 \(c\)\(\le 50\) 的质数个数),枚举质数集合就可以了。
    属于是某种暴力剪枝了。

    总结

    应该最开始思考一下能不能就地展开。看看有没有除了网络流之外的其他方法。

    D - Moving Pieces on Line

    题目叙述

    \(n\) 个人,每个人最初位置为 \(a_i\) ,一个人走过一条边会使得这条边的颜色取反。
    问使得最终每条边的颜色为 010101010 这样的序列的最小代价。这个序列的端点会被给出

    题解

    考虑差分一下这个问题。首先一个人影响的一定是一个连续段。对前缀和的影响其实就是两个端点 \(^1\)
    其次考虑最终要求的状态是什么。其实就是每个01交错处都有一个 1 。
    如果设第 \(i\) 个人起点 \(a_i\) 终点 \(b_i\) 。只要 \(a_i\)\(b_i\) 组成的集合进行 xor 就可以得到最终的集合就可以了。所以其实就是 \(a_i\) 和要求组成的集合进行匹配,或者 \(a_i\),最小距离和就是最终的答案。
    很明显 \(a_i\) 自己和自己匹配的方式一定不会相交。
    做法就很明显了 \(f_{i,j}\) 表示 \(a\) 的第 \(i\) 个数还没有决定,\(b\) 的第 \(j\) 个数还没有决定。此时的最小代价。每次转移要么 \(i\) 加二,要么 \(i,j\) 都加一。

    总结

    • 区间异或 \(\rightarrow\) 差分
    • 一条线段上的匹配 \(\rightarrow\) 是不是一定不相交?

    E - Paper Cutting 2

    题目叙述

    一张网格纸,有两个格子是黑色的。每次可以切一刀(必须沿格线并且必须将纸分为两个部分),问期望多少次两个格子会分开。

    题解

    一共有上下左右和中间这四种刀。考虑期望线性性拆分贡献,问题转化为考虑第 \(i\) 刀有多少的概率会切到。
    首先不能在中间那些刀切到之后,其次不能先在那个方向上离中心更近的地方切。
    所以贡献就是 \(\frac{1}{i+x}\) ,其中 \(x\) 是中间的刀数。

    F - Permutation Division

    题目叙述

    你现在要给一个排列切若干刀,Maroon 会给这些段重新排列。你要最小化字典序,他要最大化字典序。问最终是什么样子。

    题解

    设给定的排列为 \(p\) ,最终的排列为 \(Q\) ,那么一定有 \(Q\ge P\) 。因此字典序最小一定满足最前面的一段最小。
    二分这一段,如何判断?限制在于切 \(k\) 刀。切的刀数越多,越不能前缀的长度长。
    前缀必须满足的是切断的位置后面的第一个数一定递减。因此只要看前面的最长下降子序列的长度和后面比最长下降子序列最后一项还小的数的数量总和是不是比 \(k\) 大就可以了。

    总结

    • 最优化题 \(\rightarrow\) 考察答案的上界/下界,然后尝试分析一下为什么达不到上界/下界,怎么尽量达到上界/下界。
  • 相关阅读:
    vue开发(一)安装
    Ubuntu18.04安装mysql
    使用.NET Framework开发IIS 7.0模块和处理程序拦截请求实现跳转
    Mysql 清空数据后,释放硬盘文件
    依赖注入
    ubuntu 上开发.netcore
    使用python获取微医数据
    Mysql查询某字段重复值并删除重复值
    使用pyinstaller 打包python程序
    堆(heap)和栈(stack)、内存泄漏(memory leak)和内存溢出
  • 原文地址:https://www.cnblogs.com/YouthRhythms/p/16419785.html
Copyright © 2020-2023  润新知