算法竞赛
🧠Codeforces Round 873 (Div. 2) 总结
00 分钟
2023-5-15
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛

定个小目标:我要上1200 !!!!

A

题目大意:构造一个长度为n的序列,满足 :
  1. a[i] 能被 i 整除
  1. 序列a的所有元素之和能够 n 整除
可以发现 1 条件很容易满足,2条件与数列的和有关,考虑数列的求和公式
如果使得最后整除n能够被整除,则我们把每个元素乘以2,则整个数列的和就变成了:
可以得知结果一定是n的倍数。

B

给你一个数列,你每次可以指定一个k值,然后选择一个a[i]和a[i+k] 交换他们的值,即j-i=k,最后使得整个数列满足递增的,这个最大的k值是多少?
观察这一组数据:3 4 1 2 , n=4
可以发现3与1交换,4与2交换,则就变成了结果,显然这个k=2。
观察到:其中3应该要到下标为3(我们让下标从1开始)的位置 ,但是此时下标为1,因此我们的k值为 3-1=2 ,对于另一对也是满足的,4应该到下标为4的位置,此时下标为2,因此 k=4-2=2
观察另外一组数据:4 2 6 7 5 3 1, n=7
可以发现4此时的下标为1,按照上面的规则,如果4到达指定的位置,则 k=4-1=3;同时对于7来说:k=7-4=3;但是对于1来说,他的下标为7,他应该到下标为1的位置,因此 k =abs(1-7)=6,这与我们的之前的 k=3 有什么关系?可以发现6与3的最大公约数是3,也就是我们取k=3,这种情况就是把1交换了两次。
综上,我们对于每一个元素值和其应该到的目标下标位置相减然后取一个最大公约数即可。

C

给你两个数列:a和b,让你重新排列a数列,使得a数列的每一个值都严格大于b的对应值,即 a[i]>b[j],求出可以排列的方案数
由于a可以任意排列,同时b也可以可以任意排列。
我们把a和b同时排序,其中a从小到大排序,b从大到小排序
观察这个原始的数据:
排序后的顺序如下:
我们从b[1]开始寻找大于b[i] 的元素在a中有多少个即可。
例如:
  1. 6: a中有两个满足,分别是 8 9,可以选择两个
  1. 5: a中有三个满足,分别是6 8 9,但是其中一个已经被前面的6选了,因此只能选两个
  1. 4: a中有四个满足,分别是5 6 8 9,但是其中两个已经被前面的5和6选了,因此只能选两个
对于剩下的也是如此,最后我们得到每个b[i]对应的选择数分别是: 2 2 2 2 2 1
因此答案就是 2^5 =32
上一篇
单调队列优化dp
下一篇
欧拉函数

评论
  • Twikoo
  • Valine