結果
問題 | No.2202 贅沢てりたまチキン |
ユーザー |
|
提出日時 | 2023-02-03 22:30:33 |
言語 | Go (1.23.4) |
結果 |
AC
|
実行時間 | 50 ms / 2,000 ms |
コード長 | 5,162 bytes |
コンパイル時間 | 14,872 ms |
コンパイル使用メモリ | 225,492 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-02 20:34:22 |
合計ジャッジ時間 | 15,313 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 28 |
ソースコード
package mainimport ("bufio""fmt""math""math/big""os""strconv")// 解答欄func solve(sc *myScanner, wr *myWriter) {n, m := sc.getInt2()uf := newUnionFindTree(n * 2)for i := 0; i < m; i++ {a := sc.getIntZeroIndexed()b := sc.getIntZeroIndexed()uf.unite(a, b+n)uf.unite(a+n, b)}ans := "Yes"for i := 0; i < n; i++ {if !uf.sameRoot(i, i+n) {ans = "No"break}}wr.println(ans)}// UnionFind Treetype unionFindTree struct {// 備忘録// 根となる頂点の要素には、特別に以下のような数値が格納されています。// 「その根が含まれている木」に含まれる頂点の数にマイナスをかけたものparent []int// 連結成分の個数ですcnt int}func newUnionFindTree(n int) *unionFindTree {uf := new(unionFindTree)uf.parent = make([]int, n)for i := range uf.parent {uf.parent[i] = -1}uf.cnt = nreturn uf}func (uf *unionFindTree) findRoot(a int) int {if uf.parent[a] < 0 {return a}uf.parent[a] = uf.findRoot(uf.parent[a])return uf.parent[a]}func (uf *unionFindTree) unite(a, b int) bool {x, y := uf.findRoot(a), uf.findRoot(b)if x == y {return false}if uf.size(x) < uf.size(y) {x, y = y, x}uf.parent[x] += uf.parent[y]uf.parent[y] = xuf.cnt--return true}func (uf *unionFindTree) sameRoot(a, b int) bool {return uf.findRoot(a) == uf.findRoot(b)}func (uf *unionFindTree) size(a int) int {return -uf.parent[uf.findRoot(a)]}// 入出力の準備(sc, wr)func main() {sc := &myScanner{bufio.NewScanner(os.Stdin)}wr := &myWriter{bufio.NewWriter(os.Stdout)}startBufSize := 4096maxBufSize := math.MaxInt64sc.Buffer(make([]byte, startBufSize), maxBufSize)sc.Split(bufio.ScanWords)solve(sc, wr)wr.Flush()}// useful funcs for slicefunc makeInts(n, x int) []int {res := make([]int, n)for i := range res {res[i] = x}return res}func makeBools(n int, b bool) []bool {res := make([]bool, n)for i := range res {res[i] = b}return res}func countTrue(bs []bool) int {res := 0for _, b := range bs {if b {res++}}return res}// inputtype myScanner struct {*bufio.Scanner}func (sc *myScanner) getInt() int {return sc._getIntOffset(0)}func (sc *myScanner) getInt2() (int, int) {return sc.getInt(), sc.getInt()}func (sc *myScanner) getInt3() (int, int, int) {return sc.getInt(), sc.getInt(), sc.getInt()}func (sc *myScanner) getInt4() (int, int, int, int) {return sc.getInt(), sc.getInt(), sc.getInt(), sc.getInt()}func (sc *myScanner) getInts(n int) []int {return sc._getIntsOffset(n, 0)}func (sc *myScanner) getIntZeroIndexed() int {return sc._getIntOffset(-1)}func (sc *myScanner) getIntsZeroIndexed(n int) []int {return sc._getIntsOffset(n, -1)}func (sc *myScanner) _getIntOffset(x int) int {res, err := strconv.Atoi(sc.getString())if err != nil {panic(err)}return res + x}func (sc *myScanner) _getIntsOffset(n, x int) []int {res := make([]int, n)for i := range res {res[i] = sc._getIntOffset(x)}return res}func (sc *myScanner) getString() string {sc.Scan()return sc.Text()}func (sc *myScanner) getStrings(n int) []string {res := make([]string, n)for i := range res {res[i] = sc.getString()}return res}func (sc *myScanner) getRunes() []rune {return []rune(sc.getString())}func (sc *myScanner) getFloat() float64 {res, err := strconv.ParseFloat(sc.getString(), 64)if err != nil {panic(err)}return res}func (sc *myScanner) getFloats(n int) []float64 {res := make([]float64, n)for i := range res {res[i] = sc.getFloat()}return res}// outputtype myWriter struct {*bufio.Writer}func (wr *myWriter) println(a ...interface{}) {fmt.Fprintln(wr, a...)}func (wr *myWriter) printf(format string, a ...interface{}) {fmt.Fprintf(wr, format, a...)}// simple math funcs for intfunc max(as ...int) int {res := as[0]for _, a := range as {if res < a {res = a}}return res}func min(as ...int) int {res := as[0]for _, a := range as {if res > a {res = a}}return res}func chMax(a *int, b int) {*a = max(*a, b)}func chMin(a *int, b int) {*a = min(*a, b)}func abs(a int) int {if a < 0 {return -a}return a}func pow(a, n int) int {res := 1b := afor n > 0 {if n&1 > 0 {res *= b}n >>= 1b *= b}return res}func sum(s ...int) int {res := 0for _, v := range s {res += v}return res}func checkPrime(a int) bool {if a == 2 {return true} else if a%2 == 0 {return false}res := truefor q := 3; q*q <= a; q += 2 {if a%q == 0 {res = falsebreak}}return res}func toBInt(a int) *big.Int {return big.NewInt(int64(a))}/*めもint(64)の最大値: 9223372036854775807 = (2^63 - 1)19桁10^18 < 2^60 < 2^63 < 10^1910^19 はintだとオーバーフローするsliceの長さ: 10^8程度までは許される型によるがそれ以上は Out of memory の危険がある1~nの和: {n*(n+1)}/2(1~nの平均値)*n を式変形したもの先に掛け算をすることで必ず2で割り切れる*/