LoginSignup
0
1

More than 3 years have passed since last update.

AtCoder Beginner Contest 174 参戦記

Last updated at Posted at 2020-08-02

AtCoder Beginner Contest 174 参戦記

9ペナの大爆死. 終了1分半前にギリギリE問題を通したおかげで、レーティングが小ダウンで済んだ.

ABC174A - Air Conditioner

1分で突破. 書くだけ.

X = int(input())

if X >= 30:
    print('Yes')
else:
    print('No')

ABC174B - Distance

2分半で突破. 書くだけ.

N, D = map(int, input().split())

result = 0
for _ in range(N):
    X, Y = map(int, input().split())
    if X * X + Y * Y <= D * D:
        result += 1
print(result)

ABC174D - Alter Altar

20分くらい?で突破. RE×1, WA×4. 一番左にある白い石を一番右にある赤い石とスワップするを繰り返して、白い石の右側に赤い石がない状態にすれば良い. 言うのは簡単なのに、実装でハマりました…….

N = int(input())
c = input()

d = list(c)

i = 0
j = N - 1
result = 0
while True:
    while i < N and d[i] != 'W':
        i += 1
    while j > 0 and d[j] != 'R':
        j -= 1
    if i == N or j == -1 or i >= j:
        break
    d[i] = 'R'
    d[j] = 'W'
    result += 1
print(result)

ABC174C - Repsept

28分くらい?で突破. C問題だからナイーブに書いても行けるかと思ったら、入力例3で TLE 食らって真っ青. 多分最大値は K - 1 だろうとヤマを張って出したら通った…….

K = int(input())

t = 7
for i in range(K):
    if t % K == 0:
        print(i + 1)
        break
    t = (t * 10 + 7) % K
else:
    print(-1)

追記: K で割った余りの0以外は K - 1 種類なので、最大値は K - 1 に決まっていた. 途中で同じ値がでてくるとループなので0になることはない.

ABC174E - Logs

47分で突破. TLE×1、RE×3. heapq で正答が出るコードを書いて提出してから K≤109 に気づくチョンボ. 24分間 heapq のまま高速化の努力をした後に、これは駄目だとなった瞬間ににぶたんを閃いて、13分でコードを書いたらもう終了1分半前. 通った、助かった. しかし、 abs(ng - ok) > 1 でよく通ったな.

from math import ceil

N, K, *A = map(int, open(0).read().split())

def is_ok(n):
    t = 0
    for a in A:
        if a <= n:
            continue
        t += ceil(a / n) - 1
    return t <= K

ok = 1000000000
ng = 0.0000000001
while abs(ng - ok) > 1:
    m = (ok + ng) // 2
    if is_ok(m):
        ok = m
    else:
        ng = m

print(ceil(ok))

ABC174F - Range Set Query

各色についてrより左側にある一番右側の玉の位置がl番目以上ならカウントできるので、SegmentTree なり BIT なりで管理しながら進めれば良い. っていうのは簡単だけどぱっとは思いつかないよなあ.

package main

import (
    "bufio"
    "fmt"
    "os"
    "sort"
    "strconv"
)

type BIT []int

func newBIT(n int) BIT {
    return make([]int, n)
}

func (bit BIT) add(i, v int) {
    for i++; i <= len(bit); i += i & -i {
        bit[i-1] += v
    }
}

func (bit BIT) sum(i int) int {
    result := 0
    for i++; i > 0; i -= i & -i {
        result += bit[i-1]
    }
    return result
}

func (bit BIT) query(start int, stop int) int {
    return bit.sum(stop-1) - bit.sum(start-1)
}

func main() {
    defer flush()

    N := readInt()
    Q := readInt()

    c := make([]int, N)
    for i := 0; i < N; i++ {
        c[i] = readInt()
    }

    lr := make([][3]int, Q)
    for i := 0; i < Q; i++ {
        l := readInt() - 1
        r := readInt() - 1
        lr[i] = [3]int{i, l, r}
    }
    sort.Slice(lr, func(i, j int) bool { return lr[i][2] < lr[j][2] })

    result := make([]int, Q)
    bit := newBIT(N)
    mr := map[int]int{}
    k := 0
    for i := 0; i < N; i++ {
        if j, ok := mr[c[i]]; ok {
            bit.add(j, -1)
        }
        bit.add(i, 1)
        mr[c[i]] = i
        for k < Q && lr[k][2] == i {
            result[lr[k][0]] = bit.query(lr[k][1], lr[k][2]+1)
            k++
        }
    }

    for i := 0; i < Q; i++ {
        println(result[i])
    }
}

const (
    ioBufferSize = 1 * 1024 * 1024 // 1 MB
)

var stdinScanner = func() *bufio.Scanner {
    result := bufio.NewScanner(os.Stdin)
    result.Buffer(make([]byte, ioBufferSize), ioBufferSize)
    result.Split(bufio.ScanWords)
    return result
}()

func readString() string {
    stdinScanner.Scan()
    return stdinScanner.Text()
}

func readInt() int {
    result, err := strconv.Atoi(readString())
    if err != nil {
        panic(err)
    }
    return result
}

var stdoutWriter = bufio.NewWriter(os.Stdout)

func flush() {
    stdoutWriter.Flush()
}

func println(args ...interface{}) (int, error) {
    return fmt.Fprintln(stdoutWriter, args...)
}

PyPy でも解けました. lr.sort(key=lambda x: x[0])lr.sort() だと TLE します. こういう PyPy のハマリポイントがなかなか分かりにくくて辛い.

from sys import stdin


def bit_add(bit, i, x):
    i += 1
    n = len(bit)
    while i <= n:
        bit[i - 1] += x
        i += i & -i


def bit_sum(bit, i):
    result = 0
    i += 1
    while i > 0:
        result += bit[i - 1]
        i -= i & -i
    return result


def bit_query(bit, start, stop):
    return bit_sum(bit, stop - 1) - bit_sum(bit, start - 1)


readline = stdin.readline

N, Q = map(int, readline().split())
c = list(map(lambda x: int(x) - 1, readline().split()))

lr = [None] * Q
for i in range(Q):
    l, r = map(lambda x: int(x) - 1, readline().split())
    lr[i] = (r, l, i)
lr.sort(key=lambda x: x[0])
l = [lr[i][1] for i in range(Q)]
r = [lr[i][0] for i in range(Q)]
idx = [lr[i][2] for i in range(Q)]

result = [0] * Q
bit = [0] * N
mr = [-1] * N
j = 0
for i in range(N):
    if mr[c[i]] != -1:
        bit_add(bit, mr[c[i]], -1)
    bit_add(bit, i, 1)
    mr[c[i]] = i
    while j < Q:
        if r[j] != i:
            break
        result[idx[j]] = bit_query(bit, l[j], r[j] + 1)
        j += 1
print(*result, sep='\n')
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1