CSES - Datatähti 2022 alku - Results
Submission details
Task:Spiraali
Sender:Tipu
Submission time:2021-10-09 13:29:26 +0300
Language:Python3 (CPython3)
Status:READY
Result:35
Feedback
groupverdictscore
#1ACCEPTED15
#2ACCEPTED20
#30
Test results
testverdicttimegroup
#1ACCEPTED0.03 s1details
#2ACCEPTED0.03 s2details
#30.03 s3details

Code

def main():
    syöte = input()
    syöte = syöte.split()
    koko = int(syöte[0])
    kohdat = int(syöte[1])
    i = 0
    x = []
    y = []
    while i < kohdat:
        uus = input().split(" ")
        x.append(int(uus[0]))
        y.append(int(uus[1]))
        i += 1
    i = 0
    while i < kohdat:
        print(laskuri(y[i],x[i],int(koko)))
        i += 1
 
    
 
    
def laskuri(sarakenro: int, rivinro: int, koko: int):
    sarakenro -= 1


    # laske kerrokset kyseisellä rivillä
    kerroksetRivis = 0
    if rivinro < (koko / 2):
        kerroksetRivis = rivinro
    else:
        kerroksetRivis = koko  - rivinro
    
    # laske kerrosvaihtelu alas
    kerroksiaAlas = 0
    if(sarakenro < kerroksetRivis):
        kerroksiaAlas = sarakenro
    else:
        kerroksiaAlas = kerroksetRivis
    
    # laske keskiväli
    keskiVäli = koko - kerroksetRivis * 2
    if(rivinro > koko / 2):
        keskiVäli -= 1
    if sarakenro <= keskiVäli + kerroksiaAlas:
        keskiVäli -= (keskiVäli + kerroksiaAlas) - sarakenro
    

    # laske kerrosvaihtelu ylös
    kerroksiaYlös = 0
    if(sarakenro >= keskiVäli + kerroksiaAlas):
        kerroksiaYlös = sarakenro - keskiVäli - kerroksiaAlas
    else:
        kerroksiaYlös = kerroksetRivis

   # if not sarakenro == kerroksiaAlas + kerroksiaYlös + keskiVäli:
  #      print("ERROR")
  #  else:
      #  print("Noice")
    
    return laske(kerroksiaAlas, keskiVäli, kerroksiaYlös, rivinro, koko)

def laske(alas: int, väli: int, ylös: int, rivi: int, koko: int):
    luku = int(rivi)

    #alas

    maxn = int(koko/2)
    maxKerroin = int((maxn + 1) * (maxn / 2) * 2)
    poisto = maxn-alas
    poistoKerroin = int((poisto + 1) * (poisto / 2) * 2)
    kerroin = int(maxKerroin - poistoKerroin)

    luku += int((4 * kerroin - 5*alas))

    #keski

    if rivi < koko/2:
        luku -= int(väli)
    else:
        luku += int(väli)
    
    #ylös
    if not ylös == 0:

        maxn = int((koko - (koko-ylös-alas-väli-1) *2) / 2)
        maxKerroin = int(((maxn + 1) * (maxn / 2)) * 2 - maxn - 1)
        poistoKerroin = 0
        poisto = int(maxn - (ylös))
        poistoKerroin = int(((poisto + 1) * (poisto / 2)) * 2 - poisto - 1)
        
        kerroin = int(maxKerroin - poistoKerroin)

       # kerroin -= (koko - (ylös+väli+alas+1)) * 2

    
        luku -= int((4 * kerroin - 5*(ylös)))

    return int(luku)
main()

Test details

Test 1

Group: 1

Verdict: ACCEPTED

input
10 100
1 1
1 2
1 3
1 4
...

correct output
1
36
35
34
33
...

user output
1
36
35
34
33
...
Truncated

Test 2

Group: 2

Verdict: ACCEPTED

input
1000 1000
371 263
915 322
946 880
53 738
...

correct output
773533
312166
206053
200080
593922
...

user output
773533
312166
206053
200080
593922
...
Truncated

Test 3

Group: 3

Verdict:

input
1000000000 1000
177757853 827347032
409613589 419171337
739269360 256524697
328695530 896842209
...

correct output
571375684522141210
967321186816598569
762879105851175000
370065046779516790
936897883750373771
...

user output
571375684522141194
967321186816598569
762879105851175000
370065046779516798
93689788375037
...
Truncated