总结
这场靠着没掉题和其他人疯狂掉题上了分,但是难题还是开不出来,C写完之后等了大概20分钟才敢交,有点太谨慎了,D题如果不放弃思考一个半小时应该能想出n3但是n2实在太巧妙了,我的脑子真的想不到啊,在这里%一下010,我也要多补些稍微难点的,以后也能靠出难题上分呀!
A题 Doggo Recoloring
水题,考虑可以靠某个大于二的把所有都改变,注意只有一个颜色的时候,直接上代码。
代码
https://paste.ubuntu.com/p/Vw6R8khjcW/
B题 Weakened Common Divisor
题意
给你a,b两个长度为n的数组,求一个大于1的整数x,满足
0
<
=
i
<
n
.
.
.
.
.
x
∣
a
[
i
]
或
者
x
∣
b
[
i
]
0<=i<n.....x|a[i]或者x|b[i]
0<=i<n.....x∣a[i]或者x∣b[i]
1<=n<=2e5
2<=a[i],b[i]<=2e9
做法
观察数据范围我们发现不能暴力的去统计每个数的因子是否可以保留,
我们观察答案一定在某一组数的因子中,而且一定可以是质因子(自行理解),而且质因子个数是log的,所以我们可以算出第一组的所有质因子,分解质因子不要忘记本身就是质因子的情况,之后在枚举每一组,看看这些质因子哪些可以保留,复杂度是nlogn
代码
https://paste.ubuntu.com/p/DBRyJwYQ8g/
C题 Plasticine zebra
题意
给你一个01序列,一次操作可以选择某个位置(字符中间的位置)将左右两侧翻转,再重新拼接,问无限次操作后可以得到最长多长的01交替序列。
做法
我们手玩几次可以发现,对于首尾相同的序列,不论怎么交换答案都不会变多,而对于首尾不同的序列,我们如果想让答案变多,就必须选择一个相同元素的位置进行反转,也就是00或者11,这样答案才会变多,而反转之后首位又变成相同的,所以我们可以知道最多反转一次,而且反转之后是首尾相接,我们只要预处理从头开始到每个位置的最长连续交替序列和从尾开始到每个位置的最长连续交替序列,之后o(n)枚举每个交替位置就可以了
代码
https://paste.ubuntu.com/p/fvQjmH4JfG/
D题 Recovering BST
题意
给你一个升序数组,问你是否可以构造一个二叉搜索树,满足相邻节点gcd>1
做法
如果学过数据结构,就可以知道升序数组即为二叉搜索树的中序遍历结果,也就是每个子树都是一段连续的区间,而且我们可以通过左右两个端点推出下一个区间的状态,我们就可以区间dp,
dp[l][r][0/1]
dp[l][r][0]表示以l为l-r区间的根时是否可以构造出合法子树,dp[l][r][1]表示以r为l-r区间的根时是否可以构造出合法子树,这样我们就把一个区间拆成两个区间,这样不断递归下去。而转移的时候我们需要知道gcd是否大于1,但是求gcd的过程是log的,为了避免超时,我们可以n^2logn预处理出每两个点之间是否可以转移。
代码
https://paste.ubuntu.com/p/xJ3NTrKZD9/
后面补不动了,有能力再来补吧。