容器vector中emplace_back()与push_back()的区别?
https://blog.csdn.net/p942005405/article/details/84764104
寒假第一场CF打的不是特别理想…主要因为一点琐事和自己傻逼打的时候电脑更新系统了…导致C推出了公式没有电脑交题…
A
将所有组合情况预处理好之后取余输出即可。
B
注意到如果一个序列已经满足Ascent了,那么其与任何其他的序列相连接都可以满足合并后的序列Ascent。那么预处理n个序列,找出Ascent序列的个数cnt,直接在答案中加上
n
2
−
(
n
−
c
n
t
)
2
n ^2 - (n -cnt)^2
n2−(n−cnt)2;再处理合并后可以满足Ascent的序列个数:只需要先记录每段序列的最大值与最小值,再用一个数组num[i]存储“最大值大于i的序列的个数”,那么一次遍历就可以通过最小值数组与num数组获得合并得到的区间中满足题意的区间个数。
C
题目要求找所有排列的happiness值之和,而happiness又由长度为
1
,
2
,
3..
,
n
1,2,3..,n
1,2,3..,n的framed segment共同贡献,所以我们将该计数等价转化为长度为
i
(
i
=
1
,
2
,
.
.
,
n
)
i(i=1,2,..,n)
i(i=1,2,..,n)的区间在所有排列中的贡献之和即可。对于长度为
i
i
i的一段工整区间,其出现的位置有
n
−
i
+
1
n - i + 1
n−i+1种情况,这段区间的元素选取种数有
n
−
i
+
1
n - i + 1
n−i+1种,这些元素的排列有
i
!
i!
i!种,剩余其他元素排列又有
(
n
−
i
)
!
(n-i)!
(n−i)!种,所以易知答案由下述和式决定:
a
n
s
=
∑
i
=
1
n
(
n
−
i
+
1
)
2
∗
i
!
∗
(
n
−
i
)
!
ans = \sum_{i = 1}^n(n - i + 1)^2*i!*(n - i)!
ans=i=1∑n(n−i+1)2∗i!∗(n−i)!
D
自己想确实不太会…看了题解后甚至也还不甚明白…仔细考察后又学习了sweepline(扫描线)的算法。扫描线算法的精髓在于动态维护集合,然而这只是我暂时粗糙的理解,等我训练完20道相关题后我再进一步完善此处。
对于这道题而言,首先将题意转化为,如果Yes,那么在A地点和i会议冲突的所有会议都应该在B地点也与i会议冲突,那么若满足:
m
a
x
S
>
e
v
e
n
t
[
i
]
.
e
∣
∣
m
i
n
E
<
e
v
e
n
t
[
i
]
.
s
maxS > event[i].e||minE < event[i].s
maxS>event[i].e∣∣minE<event[i].s
则肯定有一个会议不冲突,即不满足Yes,输出No。
当我们这样子进行考虑的时候,只需要将A地点的时间段作为时间轴,B地点的时间段作为元素,按照A中发生先后顺序加入、删除B地点的时间段。可以满足的是,该时间段集合中,已有的B中时间段在A中的时间一定与当前事件在A地点的时间段相交,这是由我们排序后顺序遍历所保证的。那么接下来只要不断的比较当前事件在B中时间段与已有元素的最值即可。
值得注意的是,由于冲突是相互的(窃以为,这是很重要的算法思维!),所以我们在顺序处理的时候就无需考虑当前事件与之后发生的某些事件可能存在的冲突问题。
如是考虑完B在A中的冲突问题后,我们互换参数,再考虑A在B中的冲突问题,两边都满足要求后才可输出YES。
D题10WA之后发现自己的BUG了...
题解代码用的是multiset,这是一个自动
l
o
g
N
logN
logN维护顺序的集合,可以通过迭代器begin()和rbegin()直接获取最小、最大的元素。
…然而我在自己写的时候就疑惑优先队列等等相关的问题…最后果然写爆了…两个迭代器我的位置写反了…我是瞎子吗…? 😃
有一说一 遇到不熟悉的STL一定要仔细考虑…