main.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. "strings"
  8. )
  9. func mousetrap(scanner *bufio.Scanner) [][]int {
  10. caseCnt := ReadInt(scanner)
  11. answer := make([][]int, caseCnt)
  12. for i := 0; i < caseCnt; i++ {
  13. cardCnt := ReadInt(scanner)
  14. deck := make([]int, cardCnt)
  15. st := NewSegmentTree(cardCnt)
  16. for i, slot := 0, 0; st[1] != 0; i++ {
  17. slot = st.Search(slot, i+1)
  18. st.Update(slot, 0)
  19. deck[slot] = i + 1
  20. }
  21. pos := ReadInts(scanner)
  22. answer[i] = make([]int, len(pos)-1)
  23. for j := 1; j < len(pos); j++ {
  24. answer[i][j-1] = deck[pos[j]-1]
  25. }
  26. }
  27. return answer
  28. }
  29. func main() {
  30. inputFiles := []string{"C-small-practice.in", "C-large-practice.in", "test.in"}
  31. outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
  32. const (
  33. small = iota
  34. large
  35. test
  36. )
  37. fileType := test
  38. fin, _ := os.Open(inputFiles[fileType])
  39. defer fin.Close()
  40. scanner := bufio.NewScanner(fin)
  41. answer := mousetrap(scanner)
  42. fout, _ := os.Create(outputFiles[fileType])
  43. defer fout.Close()
  44. for i := range answer {
  45. var ans strings.Builder
  46. for _, n := range answer[i] {
  47. ans.WriteString(" " + strconv.Itoa(n))
  48. }
  49. s := fmt.Sprintf("Case #%d:%s\n", i+1, ans.String())
  50. fout.WriteString(s)
  51. }
  52. }