7
:
50
−
8
:
00
7:50 - 8:00
7:50−8:00
看题,一看到第二题就感觉是个 二分,然后看第三题的时候脑子里还是第二题,所以先把第二题码了。时间复杂度
O
(
N
2
∗
l
o
g
N
)
O(N^2*log_N)
O(N2∗logN)。
8
:
00
−
9
:
00
8:00 - 9:00
8:00−9:00
搞完这个
T
2
T2
T2 的二分。
先按照度数sort
一遍,然后二分出来答案
K
K
K ,判断的时候就双重for
循环看每两个点是否能连到一起,最后扫一遍看每个点的度数,如果是完全图的话每个点的度数肯定就是
n
−
1
n-1
n−1了。
又看了看其他题,感觉还是
T
1
T1
T1 最可做。
9
:
00
−
9
:
30
9:00 - 9:30
9:00−9:30
把
T
1
T1
T1 的
20
20
20 分全排列DFS写出来。
9
:
30
−
9
:
40
9:30 - 9:40
9:30−9:40
思考用压到二进制上做
T
1
T1
T1
9
:
30
−
10
:
10
9:30-10:10
9:30−10:10
搞出来刚刚的想法
10
:
10
−
10
:
25
10:10 - 10:25
10:10−10:25
又看其他题,并且在没有特别好的想法的情况下,写出来造
T
1
T1
T1 数据的代码和对拍程序开始拍。
10
:
25
−
11
:
00
10:25-11:00
10:25−11:00
针对拍出来的问题进行修改,并且反复拍,但是一直有问题,所以只留了
20
20
20 分的代码。
11
:
00
−
11
:
10
11:00-11:10
11:00−11:10
思考
T
3
T3
T3 和
T
4
T4
T4 ,主要在推
T
3
T3
T3 ,没写出什么部分分的代码,着手
T
4
T4
T4。
11
:
10
−
12
:
00
11:10 - 12:00
11:10−12:00
觉得
T
4
T4
T4 可以暴力取出前头的一段区间和尾部的一段区间,尾部的乘个
−
1
-1
−1,用二分的方法分别求逆序对看需要换几次位置。但是可能这个想法是错的?没能过掉三个样例,感觉一开始树状数组搞可能会好一点吧。
T
2
T2
T2 写挂了,题解中说用队列
O
(
N
3
)
O(N^3)
O(N3)。但是我查了查错,发现原来我直接双重for
循环可能出现
所以可以再套个
while
循环判断这次的双重for
循环是否造成贡献,如果无影响就跳出来,这样的话时间复杂度上会多一个小常数,即这个while
循环的运行次数,在这道题的数据中究竟得是多少呢?
虽然不能算是保证,但是在这些数据中应该是
10
10
10。(我把双重for
循环复制到
10
10
10 次后正好能过)。虽然数据造的巨无比强的话可能不止
10
10
10次,但感觉还不至于是题解中队列的
O
(
N
3
)
O(N^3)
O(N3) 。因为很粗略想一下如果每次连
1
1
1 个边的话,可能确实是
O
(
N
3
l
o
g
N
)
O(N^3log_N)
O(N3logN) ,可是不可能一次只连一个,总要把某个点的度数堆得很高,然后必然可以一下连好多好多边。
T
4
T4
T4 果然得上树状数组,按照从小到大的顺序枚举每个数,每次选择将这个数放在序列的左边或右边。其中还有个比较显然的性质,即“每次放到左边或右边需要移动的次数是初始序列中左边或右边比这个数大的数的个数,与其它数选择放在左边还是右边无关”。
考试的时候压根没在想推性质,光想着之前好像做过有题让通过相邻两数swap
使得数列满足单调上升,然后方法是求逆序对,然后这个题就直接莽了点,前头求一下,后头乘
−
1
-1
−1,再求一下,最后相加。