package main import ( . "fmt" . "os" bf "bufio" "container/list" "math" "math/rand" ) func min(a,b int) int { if a 0 { i := tt1[0] tt[rl][vg] = tt1[1:] elem := plist.PushBack(i) tte[rl][vg] = append(tte[rl][vg], elem) used[i] = true break loop1 } } } for _, rl := range rand.Perm(50) { for _, vg := range rand.Perm(50) { if len(tt[rl][vg]) == 0 || len(tte[rl][vg]) > 0 { continue } t := tt[rl][vg][0] elem := plist.Front() var best int64 var bestElem *list.Element { i := elem.Value.(int) best = -int64(rs[i]-ls[i]+1)*100 best += int64(rs[t]-ls[t]+1)*100 best += parttime(ls,rs,p, t, i) } for elem != nil { i := elem.Value.(int) next := elem.Next() if next != nil { k := next.Value.(int) diff := -parttime(ls,rs,p, i,k) diff += parttime(ls,rs,p, i,t) diff += parttime(ls,rs,p, t,k) if diff < best { best = diff bestElem = elem } } else { diff := parttime(ls,rs,p, i,t) if diff < best { best = diff bestElem = elem } } elem = next } if bestElem != nil { newElem := plist.InsertAfter(t, bestElem) tt[rl][vg] = tt[rl][vg][1:] tte[rl][vg] = append(tte[rl][vg], newElem) used[t] = true } else { elem = plist.Front() newElem := plist.InsertBefore(t, elem) tt[rl][vg] = tt[rl][vg][1:] tte[rl][vg] = append(tte[rl][vg], newElem) used[t] = true } } } for rl, tt0 := range tt { for vg, tt1 := range tt0 { for _, t := range tt1 { var best int64 = math.MaxInt64 var bestElem *list.Element for _, elem := range tte[rl][vg] { i := elem.Value.(int) if prev := elem.Prev(); prev != nil { j := prev.Value.(int) diff :=-parttime(ls,rs,p, j, i) diff += parttime(ls,rs,p, j, t) diff += parttime(ls,rs,p, t, i) if diff < best { best = diff bestElem = prev } } else { diff :=-int64(rs[i]-ls[i]+1)*100 diff += int64(rs[t]-ls[t]+1)*100 diff += parttime(ls,rs,p, t, i) if diff < best { best = diff bestElem = nil } } if next := elem.Next(); next != nil { j := next.Value.(int) diff :=-parttime(ls,rs,p, i, j) diff += parttime(ls,rs,p, i, t) diff += parttime(ls,rs,p, t, j) if diff < best { best = diff bestElem = elem } } else { diff := parttime(ls,rs,p, i, t) if diff < best { best = diff bestElem = elem } } } if best < math.MaxInt64 { if bestElem != nil { newElem := plist.InsertAfter(t, bestElem) tte[rl][vg] = append(tte[rl][vg], newElem) used[t] = true } else { bestElem = plist.Front() newElem := plist.InsertBefore(t, bestElem) tte[rl][vg] = append(tte[rl][vg], newElem) used[t] = true } } } } } if plist.Len() == len(p) { p = p[:0] elem := plist.Front() for elem != nil { p = append(p, elem.Value.(int)) elem = elem.Next() } } for j := 0; j < 60; j++ { for i := range rand.Perm(q) { k := min(rand.Intn(q/2500+1)+i+1,q-1) f,g := min(i,k), max(i,k) var t0,t1 int64 if f > 0 { t0 += parttime(ls,rs,p,f-1,f) t1 += parttime(ls,rs,p,f-1,g) } else { t0 += int64(rs[p[f]]-ls[p[f]]+1)*100 t1 += int64(rs[p[g]]-rs[p[g]]+1)*100 } if g+1 < len(p) { t0 += parttime(ls,rs,p,g,g+1) t1 += parttime(ls,rs,p,f,g+1) } if t0 >= t1 { for ; f 0 { Fprint(wr, " ") } Fprint(wr, vp+1) } Fprintln(wr) }