Codeforces Round #111 (Div. 2)

时间:2022-06-12 16:03:35

Codeforces Round #111 (Div. 2)

C. Find Pair

题意

  • 给\(N(N \le 10^5)\)个数,在所有\(N^2\)对数中求第\(K(K \le N^2)\)对数。
  • 排序按照pair比较,first为第一关键字,second第二关键字。

思路

  • 统计\(cnt[x]\)为值\(x\)出现的次数。
  • 第一关键字为\(x\)的对数为\(cnt[x] \times n\),显然可以找到第一关键字。
  • 在确定第一关键字\(x\)后,第二关键字\(y\)的出现次数为\(cnt[x] \times cnt[y]\),通过前缀和就可以求出第二关键字。

代码


D. Edges in MST

题意

  • 一张带边权的无向图,有\(N(N \le 10^5)\)个点,\(M(M \le 10^5)\)条边。
  • 对于每条边,判定在最小生成树的状态:在任一最小生成树中(any)、在一种最小生成树中(at least one)、不在任一最小生成树中(none)。

思路

  • 按边权从小到大做,边权相同的一起考虑。
  • 边权较小的边形成的连通块缩点,考虑当前权值的边:
  1. 若当前的边会与边权小的边构成环,说明这条边显然不在任一生成树中。
  2. 若当前的某些边构成环,说明这些边只会在一种生成树中,否则割边会在任一生成树中。

代码


E. Buses and People

题意

  • 给\(N(N \le 10^5)\)个区间\([s_i, f_i]\)及权值\(t_i\), \(s_i, f_i, t_i \le 10^9\),保证\(t_i \ne t_j, i \ne j\)
  • 给\(M(M \le 10^5)\)个区间\([l_i, r_i]\)和权值\(b_i\)。
  • 对于\(M\)的区间,找到最小的\(t_j\)的编号\(j\),使得\(b_i \le t_j\)且\(s_j \le l_i, r_i \le f_j\)。

思路

  • 若\(s_j \le 1_i\),则相当于在\([b_i, \max{t}]\)中找到第一个\(f_j \ge r_i\)。
  • 因为每个\(t_j\)均不相同,则用线段树维护对于区间\([t_i,t_j]\)的最大\(f\)值。
  • 对于每个\(b_i\),二分\(t\)即可。

代码