• 2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17)


    2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17)

    A

    题意:有 n 个时刻,第 i 个时刻要么会在 (xi,yi) 生成一个半径为 yi 的圆,要么射击 (xi,yi) 这个点,如果该点在某个圆内则把对应圆删除并输出该圆的标号,否则输出 -1 。任意时刻圆之间不会相交(可以相切)。 (n le 2*10^5, -10^9 le x_i,y_i le 10^9, y_i > 0)

    key:线段树,结论

    结论:与一条竖线相交的圆的个数不超过 (O(log max y_i)) 个。

    证明:可以证明下图中,两圆的半径比是 4。也就是说最差时半径以4倍增长。

    1563212622108

    所以每次只需要找到覆盖该竖线的所有圆,然后一个个check即可。可以用线段树维护。

    当一个圆插入时,它覆盖的区间最大为 ((x_i-y_i,x_i+y_i)) 。以查找直线左边的圆为例,只要在 (x_i) 处把 (x_i+y_i) 插入,之后询问时递归直线左半边,如果区间最大值比 (x_i) 小则直接 return。递归到叶子时计算是否可行。

    因为至多递归到 log 个叶子,所以总复杂度是 (O(nlog n log max y_i))

    仔细观察可以发现实际上只有 i+k*m 这个集合中的点有边,并且形成了一个环,而环的大小就是集合中 1 的个数。

    I

    题意:一个随机排列,偶数按顺序放到 e 数组中,奇数按顺序放到 o 数组中。每次可以询问 (e_i)(o_j) 的大小关系。求在 (3*10^5) 的询问数下输出 e 和 o 。 (n le 10000)

    key:排序,交互

    考虑快排:每次把区间分为两段。

    枚举 o 中的每个数,此时考虑有若干段区间,该数一定存在在某个区间中间(或者是 1 或 n,这个要特判)。由于区间之间存在有序性,所以可以先对所有区间二分,此时该数只会落在两个区间内,然后再从两个区间里暴力判断。由于是随机排列,所以可以证明总询问数是 (O(n log n))

    L

    题意:给出树上 m 条路径,询问是否有两条路径相交(包含不算)。 (n,m le 2*10^5)

    key:树剖,随机权值

    考虑路径覆盖。相离好说,现在问题是如何把相交和包含区分出来。

    考虑相交:即做路径覆盖时,被覆盖的每一个点的覆盖状态一致(都没被覆盖/都被某些路径覆盖),否则就一定存在相交。

    为了在每个点上保存“被覆盖的状态”,容易想到哈希。实际上只要给每个路径附一个随机的权值,那样可以认为在做的过程中它们任意两个集合的权值异或和不相同(虽然所有集合的异或和肯定有相同的,但是算法执行过程中不会遍历太多的集合)。此时覆盖一条路径时只需要每个点异或上该路径的权值即可。

  • 相关阅读:
    掌门教育首通和续费文案整理
    python upload file遇到的坑,整理如下
    测试难题(转)
    敏捷测试与传统测试的区别
    质量体系
    幂等校验
    Charles常用功能整理
    测试难题
    敏捷测试与传统测试的区别
    质量体系
  • 原文地址:https://www.cnblogs.com/dqsssss/p/11192583.html
Copyright © 2020-2023  润新知