結果
問題 | No.1618 Convolution? |
ユーザー | yuruhiya |
提出日時 | 2021-07-22 21:39:22 |
言語 | Crystal (1.11.2) |
結果 |
AC
|
実行時間 | 88 ms / 2,000 ms |
コード長 | 5,593 bytes |
コンパイル時間 | 12,582 ms |
コンパイル使用メモリ | 293,312 KB |
実行使用メモリ | 31,360 KB |
最終ジャッジ日時 | 2024-07-17 16:53:57 |
合計ジャッジ時間 | 17,837 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,812 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 52 ms
17,152 KB |
testcase_03 | AC | 61 ms
30,208 KB |
testcase_04 | AC | 54 ms
16,384 KB |
testcase_05 | AC | 6 ms
5,376 KB |
testcase_06 | AC | 72 ms
28,288 KB |
testcase_07 | AC | 71 ms
28,360 KB |
testcase_08 | AC | 55 ms
16,896 KB |
testcase_09 | AC | 87 ms
31,104 KB |
testcase_10 | AC | 60 ms
25,344 KB |
testcase_11 | AC | 83 ms
30,336 KB |
testcase_12 | AC | 87 ms
31,232 KB |
testcase_13 | AC | 84 ms
31,232 KB |
testcase_14 | AC | 88 ms
31,360 KB |
testcase_15 | AC | 83 ms
31,104 KB |
testcase_16 | AC | 85 ms
31,232 KB |
ソースコード
# require "/scanner" # ### Specifications # # ```plain # Inside input macro | Expanded code # ----------------------------------------------+--------------------------------------- # Uppercase string: Int32, Int64, Float64, etc. | {}.new(Scanner.s) # s | Scanner.s # c | Scanner.c # Other lowercase string: i, i64, f, etc. | Scanner.s.to_{} # operator[]: type[size] | Array.new(input(size)) { input(type) } # Tuple literal: {t1, t2, t3} | {input(t1), input(t2), input(t3)} # Array literal: [t1, t2, t3] | [input(t1), input(t2), input(t3)] # Range literal: t1..t2 | input(t1)..input(t2) # If: cond ? t1 : t2 | cond ? input(t1) : input(t2) # Assign: target = value | target = input(value) # ``` # # ### Examples # # Input: # ```plain # 5 3 # foo bar # 1 2 3 4 5 # ``` # ``` # n, m = input(Int32, Int64) # => {5, 10i64} # input(String, Char[m]) # => {"foo", ['b', 'a', 'r']} # input(Int32[n]) # => [1, 2, 3, 4, 5] # ``` # ``` # n, m = input(i, i64) # => {5, 10i64} # input(s, c[m]) # => {"foo", ['b', 'a', 'r']} # input(i[n]) # => [1, 2, 3, 4, 5] # ``` # # Input: # ```plain # 2 3 # 1 2 3 # 4 5 6 # ``` # # ``` # h, w = input(i, i) # => {2, 3} # input(i[h, w]) # => [[1, 2, 3], [4, 5, 6]] # ``` # ``` # input(i[i][i]) # => [[1, 2, 3], [4, 5, 6]] # ``` # # Input: # ```plain # 5 3 # 3 1 4 2 5 # 1 2 # 2 3 # 3 1 # ``` # ``` # n, m = input(i, i) # => {5, 3} # input(i.pred[n]) # => [2, 0, 3, 1, 4] # input({i - 1, i - 1}[m]) # => [{0, 1}, {1, 2}, {2, 0}] # ``` # # Input: # ```plain # 3 # 1 2 # 2 2 # 3 2 # ``` # ``` # input({tmp = i, tmp == 1 ? i : i.pred}[i]) # => [{1, 2}, {2, 1}, {3, 1}] # ``` class Scanner private def self.skip_to_not_space peek = STDIN.peek not_space = peek.index { |x| x != 32 && x != 10 } || peek.size STDIN.skip(not_space) end def self.c skip_to_not_space STDIN.read_char.not_nil! end def self.s skip_to_not_space peek = STDIN.peek if index = peek.index { |x| x == 32 || x == 10 } STDIN.skip(index + 1) return String.new(peek[0, index]) end String.build do |buffer| loop do buffer.write peek STDIN.skip(peek.size) peek = STDIN.peek break if peek.empty? if index = peek.index { |x| x == 32 || x == 10 } buffer.write peek[0, index] STDIN.skip(index) break end end end end end macro internal_input(s, else_ast) {% if Scanner.class.has_method?(s.id) %} Scanner.{{s.id}} {% elsif s.stringify == "String" %} Scanner.s {% elsif s.stringify == "Char" %} Scanner.c {% elsif s.stringify =~ /[A-Z][a-z0-9_]*/ %} {{s.id}}.new(Scanner.s) {% elsif String.has_method?("to_#{s}".id) %} Scanner.s.to_{{s.id}} {% else %} {{else_ast}} {% end %} end macro internal_input_array(s, args) {% for i in 0...args.size %} %size{i} = input({{args[i]}}) {% end %} {% begin %} {% for i in 0...args.size %} Array.new(%size{i}) { {% end %} input({{s.id}}) {% for i in 0...args.size %} } {% end %} {% end %} end macro input(s) {% if s.is_a?(Call) %} {% if s.receiver.is_a?(Nop) %} internal_input( {{s.name}}, {{s.name}}( {% for argument in s.args %} input({{argument}}), {% end %} ) ) {% elsif s.name.stringify == "[]" %} internal_input_array({{s.receiver}}, {{s.args}}) {% else %} input({{s.receiver}}).{{s.name.id}}( {% for argument in s.args %} input({{argument}}), {% end %} ) {{s.block}} {% end %} {% elsif s.is_a?(TupleLiteral) %} { {% for i in 0...s.size %} input({{s[i]}}), {% end %} } {% elsif s.is_a?(ArrayLiteral) %} [ {% for i in 0...s.size %} input({{s[i]}}), {% end %} ] {% elsif s.is_a?(RangeLiteral) %} Range.new(input({{s.begin}}), input({{s.end}}), {{s.excludes_end?}}) {% elsif s.is_a?(If) %} {{s.cond}} ? input({{s.then}}) : input({{s.else}}) {% elsif s.is_a?(Assign) %} {{s.target}} = input({{s.value}}) {% else %} internal_input({{s.id}}, {{s.id}}) {% end %} end macro input(*s) { {% for s in s %} input({{s}}), {% end %} } end # require "/datastructure/imos_linear" class ImosLinear(T) getter size : Int32 @builded = false def initialize(@size : Int32) @a = Array(T).new(@size + 1, T.zero) @b = Array(T).new(@size + 1, T.zero) end # Add `a + (i - l) * b` to `[l, r)`. def add(start : Int, count : Int, val_a : T, val_b : T) : Nil raise "self had been called `#build`" if @builded raise ArgumentError.new "Negative count: #{count}" if count < 0 @a[start] += val_a - val_b * start @b[start] += val_b @a[start + count] -= val_a - val_b * start @b[start + count] -= val_b end def add(range : Range, val_a : T, val_b : T) : Nil start, count = Indexable.range_to_index_and_count(range, size) || raise IndexError.new add(start, count, val_a, val_b) end def build : Array(T) raise "self had been called `#build`" if @builded @builded = true (0...size).map do |i| @a[i + 1] += @a[i] @b[i + 1] += @b[i] @a[i] + @b[i] * i end end end n = input(i) a, b = input(i64[n], i64[n]) imos = ImosLinear(Int64).new(2 * n + 1) (0...n).each do |i| imos.add(i + 2, n, a[i], a[i]) imos.add(i + 2, n, b[i], b[i]) end puts imos.build[1..].join(' ')