2018 ACM-ICPC 青岛网络赛
最近打比赛不知道为什么总是怀疑自己
写完之后不敢交,一定跟学长说一遍自己的思路
然后发现"哦原来我是对的"
然后就A掉了……
所以还是要有自信
Problem A
最大值直接输出m,最小值二分答案就可以了 。
Problem B
现场没过这个题……
原因是……ZJH的代码写错了一个细节(看起来很对)
所以有的时候并不能想当然。
我们的思路是这样的,首先把原来的树分成若干子树。
记录每个点管辖它的最近的红祖先。然后分离出来。
对于每个询问得到若干个子树,每个子树若干个被询问的点。
我们发现答案肯定不会小于第二大的子树的那个答案。
那么要做的事情就是在第一大的子树里面添加红点。
把第一大的子树里面的询问的点按照距离降序排序。
然后前缀LCA求下来更新答案,跟后面的没有减小答案的求个较大值然后更新答案。
时间复杂度$O(nlogn + ∑klogk)$
Problem C
简单的模拟题,按照题意走下一步。
开个数组标记一下,如果之前走到过这步那么结果是No。
Problem D
Problem E
Problem F
Problem G
这个题我们要对每个数实时维护他所在的那个连通区间(最左端,最右端)
我用了线段树实现。
首先有个结论:每次把一个序列拆成两段,小的那段的规模加起来级别是$nlogn$的。
那么每次假设我们知道了$[L, R]$的逆序对个数,现在要把他拆成$[L, x - 1], [x + 1, R]$,
那么枚举小的那段的每个数,求出另一段有几个数大于或小于他,这个用主席树实现。
同时求出小的那段的逆序对数,这个跟上面那个类似。
然后还要求出$x$这个位置的数对两边分别的影响(也是主席树上查询)
那么这样就可以求出两段各自的逆序对数,套个堆就可以了。
Problem H
Problem I
Problem J
Problem K