結果
問題 |
No.5010 Better Mo's Algorithm is Needed!! (Unweighted)
|
ユーザー |
![]() |
提出日時 | 2025-01-26 03:44:26 |
言語 | Go (1.23.4) |
結果 |
AC
|
実行時間 | 354 ms / 5,000 ms |
コード長 | 2,543 bytes |
コンパイル時間 | 14,219 ms |
コンパイル使用メモリ | 242,592 KB |
実行使用メモリ | 14,452 KB |
スコア | 58,829,610 |
最終ジャッジ日時 | 2025-01-26 03:45:57 |
合計ジャッジ時間 | 90,262 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 120 |
ソースコード
package main import ( . "fmt" . "os" bf "bufio" "container/list" "math" "math/rand" ) func min(a,b int) int { if a<b { return a } return b } func max(a,b int) int { return a+b-min(a,b) } func parttime(ls,rs,p []int, i,j int) (t int64) { pi := p[i] a, b := ls[pi], rs[pi] pj := p[j] c, d := ls[pj], rs[pj] x,y:=min(a,c),max(a,c) u,v:=min(b,d),max(b,d) t += int64(y-x)*100 t += int64(v-u)*100 return } func main() { rd:=bf.NewReader(Stdin) wr:=bf.NewWriter(Stdout) defer wr.Flush() var n,q,wt,st int Fscan(rd,&n,&q,&wt,&st) ws := make([]int, n) ls := make([]int, q) rs := make([]int, q) p := make([]int, q) for i := range ws { Fscan(rd,&ws[i]) } for i := range ls { Fscan(rd,&ls[i],&rs[i]) p[i] = i } tt := make([][][]int, 50) tte := make([][][]*list.Element, 50) for i := range tt { tt[i] = make([][]int, 50) tte[i] = make([][]*list.Element, 50) } for i,vl := range ls { vr := rs[i] rl := (vr-vl)/4000 vg := (vr+vl)/8000 tt[rl][vg] = append(tt[rl][vg], i) } used := make([]bool, q) plist := list.New() loop1: for rl,tt0 := range tt { for vg,tt1:= range tt0 { if len(tt1)> 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 = math.MaxInt64 var bestElem *list.Element for elem != nil { 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 } } 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 } } } for i,vp := range p { if i > 0 { Fprint(wr, " ") } Fprint(wr, vp+1) } Fprintln(wr) }