Skip to content

Instantly share code, notes, and snippets.

@FF256grhy
Last active September 18, 2017 02:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FF256grhy/8264ffc287b809a4ba773dc3e0947a52 to your computer and use it in GitHub Desktop.
Save FF256grhy/8264ffc287b809a4ba773dc3e0947a52 to your computer and use it in GitHub Desktop.
Kuin で競プロをやってみた
{
とりあえず Kuin で何か書いてみたかったので、yuikcoder No. 568 (https://yukicoder.me/problems/no/568) を解くコードを書きました
解法自体は以前 C++ で書いたコード (https://yukicoder.me/submissions/204601) をほぼそのまま移植しただけです
一応すべてのテストケースが通ることをローカルで確認しました
}
var n: int
var m: int
var x: []int
var a: []int
var b: []int
var la: [][]list<int>
var lb: [][]list<int>
var sa: int
var sb: int
var c: [][][]int
const LIM: int :: 100001
func init()
do @x :: #[@n]int
do @a :: #[@n]int
do @b :: #[@n]int
do @la :: #[4, @LIM]list<int>
do @lb :: #[4, @LIM]list<int>
for i(0, 4 - 1)
for j(0, @LIM - 1)
do @la[i][j] :: #list<int>
do @lb[i][j] :: #list<int>
end for
end for
do @c :: #[4, 2, 2]int
end func
func main()
var in: []int :: @rdIA()
do @n :: in[0]
do @m :: in[1]
do @init()
for i(0, @n - 1)
do in :: @rdIA()
do @x[i] :: in[0]
do @a[i] :: in[1]
do @b[i] :: in[2]
end for
for i(0, @n - 1)
do @la[@x[i]][@a[i]].add(@b[i])
do @lb[@x[i]][@b[i]].add(@a[i])
end for
do @sa :: 0
do @sb :: @LIM
for i(0, @n - 1)
do @c[@x[i]][@sa <= @a[i] ?(1, 0)][@sb <= @b[i] ?(1, 0)] :+ 1
end for
var ans: int :: @n
while((@f(2) >= @m ?(@ai(), @bd())), skip)
if(@f(2) >= @m)
do @setmin(&ans, @f(3))
end if
end while
do cui@print("\{ans}\n")
end func
func f(x: int): int
var v: int :: 0
for i(0, 4 - 1)
for j(0, 2 - 1)
for k(0, 2 - 1)
if(x <= i + j + k)
do v :+ @c[i][j][k]
end if
end for
end for
end for
ret v
end func
func ai(): bool
if(@sa = @LIM)
ret false
end if
for i(0, 4 - 1)
var li: list<int> :: @la[i][@sa]
do li.head()
while(! li.term())
do @c[i][0][@sb <= li.get() ?(1, 0)] :+ 1
do @c[i][1][@sb <= li.get() ?(1, 0)] :- 1
do li.next()
end while
end for
do @sa :+ 1
ret true
end func
func bd(): bool
if(@sb = 0)
ret false
end if
do @sb :- 1
for i(0, 4 - 1)
var li: list<int> :: @lb[i][@sb]
do li.head()
while(! li.term())
do @c[i][@sa <= li.get() ?(1, 0)][1] :+ 1
do @c[i][@sa <= li.get() ?(1, 0)][0] :- 1
do li.next()
end while
end for
ret true
end func
; ---- ----
func rdSA(): [][]char
var in: []char :: cui@input().trim()
ret (in = "" ?(#[0, 0]char, in.split(" ")))
end func
func rdIA(): []int
var sa: [][]char :: @rdSA()
var ia: []int :: #[^sa]int
for i(0, ^sa - 1)
do sa[i].toInt(&ia[i])
end for
ret ia
end func
func setmin(a: &int, b: int): bool
if(a > b)
do a :: b
ret true
end if
ret false
end func
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment