func NewMainMenu(mapDir string, w, h int) (m *MainMenu) { file, err := os.Open(mapDir) defer file.Close() if err != nil { panic(err) } fis, err := file.Readdir(0) if err != nil { panic(err) } var maps *ring.Ring for _, fi := range fis { if strings.HasSuffix(fi.Name(), ".txt") { name := fi.Name() mapName := name[:len(name)-4] r := ring.New(1) r.Value = mapName if maps != nil { maps.Link(r) } else { maps = r } } } return &MainMenu{maps, time.Now(), w, h} }
func (c *Cache) meta_add(key string, r *ring.Ring) { c.evict() c.keys[key] = r r.Link(c.hand_hot) if c.hand_hot == nil { // first element c.hand_hot = r c.hand_cold = r c.hand_test = r } if c.hand_cold == c.hand_hot { c.hand_cold = c.hand_cold.Prev() } }
func main() { var n, m int f, _ := os.Create("yes.pprof") pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() fmt.Scan(&n) fmt.Scan(&m) bucket2number := make(map[int]*ring.Ring) number2bucket := map[int]int{0: 0, n - 1: n - 1} bucketlen := map[int]int{0: 1, n - 1: 1} bucket2number[0] = ring.New(1) bucket2number[0].Value = 0 bucket2number[n-1] = ring.New(1) bucket2number[n-1].Value = n - 1 var a, b int var la, lb *ring.Ring var debug = false for i := 0; i <= m; i++ { fmt.Scan(&a, &b) ba, ok := number2bucket[a] if !ok { number2bucket[a] = a bucketlen[a] = 1 ba = a la = ring.New(1) la.Value = a bucket2number[ba] = la } else { la = bucket2number[ba] } bb, ok := number2bucket[b] if !ok { number2bucket[b] = b bucketlen[b] = 1 bb = b lb = ring.New(1) lb.Value = b bucket2number[bb] = lb } else { lb = bucket2number[bb] } if ba != bb { // Not connected yet if bucketlen[ba] < bucketlen[bb] { la, lb = lb, la ba, bb = bb, ba } for j := 0; j < bucketlen[bb]; j++ { number2bucket[lb.Value.(int)] = ba lb = lb.Next() } la.Link(lb) bucketlen[ba] += bucketlen[bb] delete(bucket2number, bb) if number2bucket[0] == number2bucket[n-1] { fmt.Printf("Connected at %d\n", i) return } } if debug { fmt.Printf("%d -> %d\n", a, b) fmt.Print("Bucket2Number\n") for k, v := range bucket2number { fmt.Print(k) v.Do( func(x interface{}) { fmt.Printf(" %d", x.(int)) }) fmt.Println() } fmt.Print("Number2Bucket\n") for k, v := range number2bucket { fmt.Printf("%d: %d\n", k, v) } } } fmt.Println("Not connected") }