From 9d82ef9fb8263ffb6275483da636bf34698c022f Mon Sep 17 00:00:00 2001 From: Baoshuo Date: Fri, 10 Jun 2022 17:21:03 +0800 Subject: [PATCH] =?UTF-8?q?#112.=20=E4=B8=89=E7=BB=B4=E5=81=8F=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://loj.ac/s/1479954 --- LibreOJ/112/112.go | 137 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 LibreOJ/112/112.go diff --git a/LibreOJ/112/112.go b/LibreOJ/112/112.go new file mode 100644 index 00000000..8b5b7dd7 --- /dev/null +++ b/LibreOJ/112/112.go @@ -0,0 +1,137 @@ +package main + +import ( + "fmt" + "sort" +) + +const N int = 1e5 + 5 +const K int = 2e5 + 5 + +type node struct { + a, b, c, cnt, res int +} + +var ( + q []node + w [N]node + c, ans [K]int +) + +func lowbit(x int) int { + return x & -x +} + +func add(x, y int) { + for ; x <= 2e5; x += lowbit(x) { + c[x] += y + } +} + +func sum(x int) int { + var res int = 0 + + for ; x > 0; x -= lowbit(x) { + res += c[x] + } + + return res +} + +func mergeSort(l, r int) { + if l >= r { + return + } + + var mid = (l + r) / 2 + + mergeSort(l, mid) + mergeSort(mid+1, r) + + var i, j, k = l, mid + 1, 0 + + for i <= mid && j <= r { + if q[i].b <= q[j].b { + add(q[i].c, q[i].cnt) + k++ + w[k] = q[i] + i++ + } else { + q[j].res += sum(q[j].c) + k++ + w[k] = q[j] + j++ + } + } + + for i <= mid { + add(q[i].c, q[i].cnt) + k++ + w[k] = q[i] + i++ + } + + for j <= r { + q[j].res += sum(q[j].c) + k++ + w[k] = q[j] + j++ + } + + for i = l; i <= mid; i++ { + add(q[i].c, -q[i].cnt) + } + + for i, j := l, 1; j <= k; j++ { + q[i] = w[j] + i++ + } +} + +func main() { + var n, k int + + fmt.Scan(&n, &k) + + q = append(q, node{}) + + for i := 1; i <= n; i++ { + var a, b, c int + + fmt.Scan(&a, &b, &c) + + q = append(q, node{a, b, c, 1, 0}) + } + + sort.Slice(q, func(x, y int) bool { + if q[x].a != q[y].a { + return q[x].a < q[y].a + } + + if q[x].b != q[y].b { + return q[x].b < q[y].b + } + + return q[x].c < q[y].c + }) + + k = 1 + for i := 2; i <= n; i++ { + if q[i].a == q[k].a && q[i].b == q[k].b && q[i].c == q[k].c { + q[k].cnt++ + } else { + k++ + q[k] = q[i] + } + } + + mergeSort(1, k) + + for i := 1; i <= k; i++ { + ans[q[i].res+q[i].cnt-1] += q[i].cnt + } + + for i := 0; i < n; i++ { + fmt.Println(ans[i]) + } +}