赛时安排
7
:
50
−
7
:
55
7:50-7:55
7:50−7:55
看题目 T1,T3题面挺离谱…T1看第二遍才看懂每个序列的意思…T3…题面长的根本不想看…看完后,嗯是我暂时想不出来的题…
7
:
55
−
8
:
30
7:55-8:30
7:55−8:30
先搞有一点思路的T4,要把一个序列通过最少次数把它修改成凸的形状,首先想到的是找到它的逆序对数,然后按照这个想法搞了搞样例,还是有点卡…接着想了想把最大的数放到每一个位置,来看每一个数怎么移动最优,然后发现,你要把当前位置的数向左右移,它对答案的贡献实际上就是它左右两边比它大的数的数量的最小值…然后暴力来求出每一个数左右两边比它大的数的个数是
O
(
n
2
)
O(n^2)
O(n2) 的,然后就把暴力敲出来…
8
:
30
−
9
:
30
8:30-9:30
8:30−9:30
先不看T1和T3这两个不想看的题…来搞T2,这道题让满足K最小时最大…显然是个二分,二分答案…然后开始想如何验证答案,这个验证实际不难…想到暴力
O
(
n
2
)
O(n^2)
O(n2)来进行连边,直到连够边或者这一次一条边都没有连到为止,前者返回true,后者返回false,然后算了一下复杂度
O
(
k
∗
n
2
l
o
g
n
)
O(k*n^2logn)
O(k∗n2logn)(k是验证时循环的次数),然后感觉可能会挂掉…于是就开始想优化。想到了用优先队列来优化,将点度最大的先塞进队列,然后从大到小来依次连边…然后过了样例,先交了一发。
9
:
30
−
9
:
55
9:30-9:55
9:30−9:55
想起来还有附加的样例…然后去跑附加样例,发现第二个就挂了…开始查错…然后看样例答案发现,它的答案比我的二分时最大的边界还大…才想起来k是两个点的度数之和,边界应该卡到2*n,然后过了第二个样例,但第三个又被卡了…就先交上去了。
9
:
55
−
10
:
35
9:55-10:35
9:55−10:35 想了想T1和T3的思路…想了10分钟左右…发现一点思路都没有(麻了)。于是就想着T2思路应该没问题…于是返回头继续查T2的错。第三档的数据并不是特别大,我的答案比它的答案多一…于是手查一下我的答案能不能成立…结果发现check函数里挂了,然后就想优先队列这个东西是不是会有亿点点的问题…于是开始调…(调了好久没调出来),于是乎…就开始最暴力的修改,然后样例都过了…算了算复杂度感觉正常的都能过,因为每次扫总不可能都只加1条边吧…总有一次能加上特别多的边,因此,常数k还是很小的。
10
:
35
−
11
:
35
10:35-11:35
10:35−11:35
然后开始想T4的优化,先想了想线段树,但是会爆空间,于是就想到它在左右两段里排好序后和i的相对位置就是比它大的数的个数…然后写了一下,分段(要万一那个写挂了就麻了…)。
11
:
35
−
12
:
00
11:35-12:00
11:35−12:00
想了想剩下两题…随便碰了碰T1的样例…然后交了。
赛后总结
0+100+0+50=150
关于T4的优化这件事…优化了个寂寞…忘记了算每次套进去的sort的复杂度,比原来暴力的复杂度还高,后来把分段去了测了一下,35pts(我真傻,我可真傻。幸好开分段了…)。然后T4的正确优化:上树状数组(比线段树简单多了!!!)…还是树状数组写的有点少…习惯性地套思路顺一点的线段树。