Submission #38714269


Source Code Expand

package main

import (
	"bufio"
	"fmt"
	"os"
	"runtime/debug"
)

func init() {
	debug.SetGCPercent(-1)
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n, m int
	fmt.Fscan(in, &n, &m)
	uf := NewPersistentUnionfind()
	for i := 0; i < m; i++ {
		var a, b int
		fmt.Fscan(in, &a, &b)
		a, b = a-1, b-1
		uf.Union(uf.CurVersion, a, b)
	}

	var q int
	fmt.Fscan(in, &q)
	for i := 0; i < q; i++ {
		var a, b int
		fmt.Fscan(in, &a, &b)
		a, b = a-1, b-1
		if !uf.IsConnected(uf.CurVersion, a, b) {
			fmt.Fprintln(out, -1)
			continue
		}

		left, right := 0, uf.CurVersion
		for left <= right {
			mid := (left + right) / 2
			if uf.IsConnected(mid, a, b) {
				right = mid - 1
			} else {
				left = mid + 1
			}
		}
		fmt.Fprintln(out, left)
	}
}

type PersistentUnionfind struct {
	CurVersion int
	par        *PersistentArray
	savePoints []*AryNode
}

func NewPersistentUnionfind() *PersistentUnionfind {
	savePoints := []*AryNode{nil}
	return &PersistentUnionfind{
		par:        NewPersistentArray(4, -1),
		savePoints: savePoints,
	}
}

// 合并x和y所在的集合,返回当前版本号。
//  0<=version<=curVersion
//  每进行一次合并操作,版本号+1;
//  Union(curVersion,0,0)表示不进行任何操作,但是会在savePoints中增加一个版本号。
func (p *PersistentUnionfind) Union(version, x, y int) int {
	x, y = p.Find(version, x), p.Find(version, y)
	ptr := p.savePoints[version]
	if x != y {
		sizeX := -p.par.Get(p.savePoints[version], x)
		sizeY := -p.par.Get(p.savePoints[version], y)
		if sizeX > sizeY {
			p.par.ch(&ptr, x, -sizeX-sizeY)
			p.par.ch(&ptr, y, x)
		} else {
			p.par.ch(&ptr, y, -sizeX-sizeY)
			p.par.ch(&ptr, x, y)
		}
	}

	p.savePoints = append(p.savePoints, ptr)
	p.CurVersion++
	return p.CurVersion
}

//  0<=version<=curVersion
func (p *PersistentUnionfind) Find(version, x int) int {
	y := p.par.Get(p.savePoints[version], x)
	if y < 0 {
		return x
	}
	return p.Find(version, y)
}

//  0<=version<=curVersion
func (p *PersistentUnionfind) IsConnected(version, x, y int) bool {
	return p.Find(version, x) == p.Find(version, y)
}

//  0<=version<=curVersion
func (p *PersistentUnionfind) GetSize(version, x int) int {
	return -p.par.Get(p.savePoints[version], p.Find(version, x))
}

type E = int

type AryNode struct {
	data     E
	children []*AryNode
}

type PersistentArray struct {
	log  int
	null E
	Root *AryNode // 初始版本
}

// aryLog 一般取3或4
func NewPersistentArray(aryLog int, null E) *PersistentArray {
	res := &PersistentArray{log: aryLog, null: null}
	return res
}

func (p *PersistentArray) Build(nums []E) *AryNode {
	for i := 0; i < len(nums); i++ {
		p.Root = p.Set(p.Root, i, nums[i])
	}
	return p.Root
}

func (p *PersistentArray) Get(version *AryNode, index int) E {
	if version == nil {
		return p.null
	}
	if index == 0 {
		return version.data
	}
	return p.Get(version.children[index&((1<<p.log)-1)], index>>p.log)
}

func (p *PersistentArray) Set(version *AryNode, index int, data E) *AryNode {
	newNode := AryNode{data: p.null, children: make([]*AryNode, 1<<p.log)}
	if version != nil {
		copy(newNode.children, version.children)
		newNode.data = version.data
	}

	version = &newNode
	if index == 0 {
		version.data = data
	} else {
		ptr := p.Set(version.children[index&((1<<p.log)-1)], index>>p.log, data)
		version.children[index&((1<<p.log)-1)] = ptr
	}
	return version
}

func (p *PersistentArray) ch(version **AryNode, index int, data E) {
	*version = p.Set(*version, index, data)
}

Submission Info

Submission Time
Task H - Union Sets
User caomeinaixi
Language Go (1.14.1)
Score 0
Code Size 3704 Byte
Status TLE
Exec Time 2020 ms
Memory 198724 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 600
Status
AC × 3
AC × 48
TLE × 1
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt, subtask_1_17.txt, subtask_1_18.txt, subtask_1_19.txt, subtask_1_2.txt, subtask_1_20.txt, subtask_1_21.txt, subtask_1_22.txt, subtask_1_23.txt, subtask_1_24.txt, subtask_1_25.txt, subtask_1_26.txt, subtask_1_27.txt, subtask_1_28.txt, subtask_1_29.txt, subtask_1_3.txt, subtask_1_30.txt, subtask_1_31.txt, subtask_1_32.txt, subtask_1_33.txt, subtask_1_34.txt, subtask_1_35.txt, subtask_1_36.txt, subtask_1_37.txt, subtask_1_38.txt, subtask_1_39.txt, subtask_1_4.txt, subtask_1_40.txt, subtask_1_41.txt, subtask_1_42.txt, subtask_1_43.txt, subtask_1_44.txt, subtask_1_45.txt, subtask_1_46.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt
Case Name Status Exec Time Memory
sample_01.txt AC 6 ms 1844 KiB
sample_02.txt AC 2 ms 1828 KiB
sample_03.txt AC 2 ms 1828 KiB
subtask_1_1.txt AC 3 ms 1824 KiB
subtask_1_10.txt AC 59 ms 5760 KiB
subtask_1_11.txt AC 282 ms 12500 KiB
subtask_1_12.txt AC 5 ms 1876 KiB
subtask_1_13.txt AC 16 ms 2320 KiB
subtask_1_14.txt AC 2 ms 1844 KiB
subtask_1_15.txt AC 86 ms 3728 KiB
subtask_1_16.txt AC 12 ms 2176 KiB
subtask_1_17.txt AC 17 ms 2072 KiB
subtask_1_18.txt AC 3 ms 1868 KiB
subtask_1_19.txt AC 44 ms 15464 KiB
subtask_1_2.txt AC 2 ms 1828 KiB
subtask_1_20.txt AC 3 ms 1956 KiB
subtask_1_21.txt AC 17 ms 2044 KiB
subtask_1_22.txt AC 7 ms 3132 KiB
subtask_1_23.txt AC 108 ms 5152 KiB
subtask_1_24.txt AC 109 ms 5324 KiB
subtask_1_25.txt AC 118 ms 6944 KiB
subtask_1_26.txt AC 165 ms 23368 KiB
subtask_1_27.txt AC 1676 ms 188324 KiB
subtask_1_28.txt AC 1646 ms 188312 KiB
subtask_1_29.txt AC 109 ms 5144 KiB
subtask_1_3.txt AC 2 ms 1840 KiB
subtask_1_30.txt AC 111 ms 5300 KiB
subtask_1_31.txt AC 118 ms 6916 KiB
subtask_1_32.txt AC 163 ms 23316 KiB
subtask_1_33.txt AC 1740 ms 188096 KiB
subtask_1_34.txt AC 1721 ms 188084 KiB
subtask_1_35.txt AC 109 ms 5144 KiB
subtask_1_36.txt AC 109 ms 5388 KiB
subtask_1_37.txt AC 112 ms 6884 KiB
subtask_1_38.txt AC 161 ms 22848 KiB
subtask_1_39.txt AC 1584 ms 182392 KiB
subtask_1_4.txt AC 45 ms 17616 KiB
subtask_1_40.txt AC 1688 ms 198724 KiB
subtask_1_41.txt AC 79 ms 4388 KiB
subtask_1_42.txt AC 111 ms 4976 KiB
subtask_1_43.txt AC 1486 ms 117352 KiB
subtask_1_44.txt TLE 2020 ms 188124 KiB
subtask_1_45.txt AC 73 ms 3568 KiB
subtask_1_46.txt AC 103 ms 5136 KiB
subtask_1_5.txt AC 51 ms 5084 KiB
subtask_1_6.txt AC 3 ms 1856 KiB
subtask_1_7.txt AC 2 ms 1860 KiB
subtask_1_8.txt AC 2 ms 1900 KiB
subtask_1_9.txt AC 28 ms 2236 KiB