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

 

posted @ 2018-09-17 12:42  cxhscst2  阅读(400)  评论(0编辑  收藏  举报