摘要:
题目链接 #题目大意 给你n组数,每组数有a和b两个数,代表数量和让数量加1的花费,问让所有数量都不相同的最小代价。 #解题思路 如果直接贪心的话会发现情况很复杂。我们可以先求出所有数修改之后的数量应该是多少。如果两个数相同,那么其中一个数如果和其他数相同就得加到一个没有出现的数为止,不过有个更好的 阅读全文
摘要:
题目链接 #题目大意 给你两个数组,让你对b数组排序,使得所给公式算出的结果最小。 #解题思路 思路很显然,算出来每个位置会被算上的次数然后直接乘到a上再对a排序就行了,但是有个特别坑的点就是需要先排序后取模,否则原来的大小关系就会变化。 #代码 const int maxn = 3e5+10; c 阅读全文
摘要:
题目链接 #题目大意 略 #解题思路 套公式 #代码 const int maxn = 1e4+10; const int maxm = 1e6+10; ll f[100] = {0, 1, 1}; int main() { int n; for (int i = 3; i<=20; ++i) f[ 阅读全文
摘要:
题目链接 #题目大意 找一个数使这个数分别与每个数异或,其中的最大值最下。 #解题思路 可以先建一个01trie,然后在01trie上dp。如果当前位只有1或者0的话,对答案就没有贡献;如果两者都有,那么取最大值的时候肯定要加上这一位,那么答案就是这一位再加上两颗子树中的最小值。 #代码 const 阅读全文
摘要:
题目链接 #题目大意 略 #解题思路 题目要求最大的可通过半径,很容易想到二分,但是直接二分的话,情况会变得比较复杂。换个角度想一下,可以把这个人的半径“加”到各个圆和上下边界上,这样只要判断两个圆的关系已经圆与上下边界的关系就行了。 对于我们二分的半径来说,两个圆之间的距离不够这个人通过,那么能否 阅读全文
摘要:
题目链接 #题目大意 给n个数,你要把这n个数排列成前k个不降序,后n-k个不升序,只能交换相邻的两个数,问最小的交换次数。 #解题思路 对于每个数,他只有两个选择,要么排在左面,要么排在右面,所以开两个树状数组,计算这个数排到左面和排到右面需要的最小交换次数,然后取最小值就行了。 #代码 cons 阅读全文
摘要:
题目链接 #解题思路 由于题目中的数都是互不相同的,所以每交换一对数字,序列的逆序数的奇偶性就会改变一次(可以证明序列的奇偶性变化只与交换的这对数的大小关系有关)。 #代码 int arr[maxn], tmp[maxn], n, m; ll cnt; void merge(int l, int r 阅读全文
摘要:
题目链接 #题目大意 有1~n个电阻,对于$r_i$,如果i能被$d^2$整除,那么它的阻值就是无限大,否则就是i。然后有一个集合,集合$S_i$是所有能整除i的j。找一个集合S,集合中的电阻并联起来的阻值最小。 #解题思路 要想使电阻并联起来阻值最小,那么选的电阻的阻值的倒数要尽量的大,换句话说, 阅读全文
摘要:
题目链接 #题目大意 现有一棵树,初始所有点都没有染色。有以下操作: 1. 节点x及其所有子孙颜色都变更为k。 2. 要求你回答节点x的颜色。 #解题思路 先跑一个dfs序,每棵子树的根结点一定最先被访问,最后一个叶子结点最后被访问,且中间的结点都属于这棵子树。 #代码 const int maxn 阅读全文
摘要:
题目链接 #题目大意 略 #解题思路 区间异或,与其他操作不太一样,要考虑标记下传的时候子区间的标记的情况。 #代码 const int maxn = 1e5+10; int n, m; struct Tree { int l, r, sum, lz; } tree[maxn<<2]; inline 阅读全文