2847 – List: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
 
Line 51: Line 51:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
class Node:
class Node:
     def __init__(self, a, b):
     def __init__(self, a, b, next_node=None):
         self.a = a
         self.a = a
         self.b = b
         self.b = b
         self.next = None
         self.next_node = next_node




def insert_after(node, a, b):
def insert_after(node, a, b):
     new_node = Node(a, b)
     new_node = Node(a, b, node.next_node)
    new_node.next = node.next
     node.next_node = new_node
     node.next = new_node




def insert_before(head, node, a, b):
def insert_before(head, prev_node, node, a, b):
     new_node = Node(a, b)
     new_node = Node(a, b, node)
     if head == node:
     if prev_node is None:
        new_node.next = head
         return new_node
         return new_node
     else:
     else:
         prev = head
         prev_node.next_node = new_node
        while prev.next != node:
            prev = prev.next
        prev.next = new_node
        new_node.next = node
         return head
         return head




def main():
def main():
     n = int(input())
     with open('listin.txt', 'r') as fin, open('listout.txt', 'w') as fout:
    sir = [list(map(int, input().split())) for _ in range(n)]
        n = int(fin.readline().strip())
 
        if n < 1 or n > 100000:
    if len(sir) > 100000:
            fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
        print("Datele de intrare nu corespund restrictiilor impuse")
            return
        return
        a, b = map(int, fin.readline().strip().split())
 
        if a < 1 or a > 100 or b < 1 or b > 100:
    head = Node(sir[0][0], sir[0][1])
            fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
    node = head
            return
    for i in range(1, n):
        head = Node(a, b)
        node.next = Node(sir[i][0], sir[i][1])
        node = head
        node = node.next
        for _ in range(n-1):
 
            a, b = map(int, fin.readline().strip().split())
    node = head
            if a < 1 or a > 100 or b < 1 or b > 100:
    while node:
                fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
        a, b = node.a, node.b
                return
        if a % 2 == 0 and b % 2 == 1:
            node.next_node = Node(a, b)
            insert_after(node, 2*(a+b), 2*(a+b)-b)
            node = node.next_node
             node = node.next
        fout.write("Datele de intrare corespund restrictiilor impuse\n")
        elif a % 2 == 1 and b % 2 == 0:
        prev = None
            head = insert_before(head, node, 2*(a+b)-a, 2*(a+b))
        node = head
        elif a % 2 == 0 and b % 2 == 0:
        while node is not None:
            insert_after(node, (a+b)//2, (a+b)//2+b)
            if node.a % 2 == 0 and node.b % 2 == 1:
             node = node.next
                insert_after(node, 2*(node.a+node.b), 2*(node.a+node.b)-node.b)
        elif a % 2 == 1 and b % 2 == 1:
             elif node.a % 2 == 1 and node.b % 2 == 0:
            head = insert_before(head, node, (a+b)//2+a, (a+b)//2)
                head = insert_before(head, prev, node, 2*(node.a+node.b)-node.a, 2*(node.a+node.b))
        node = node.next
            elif node.a % 2 == 0 and node.b % 2 == 0:
 
                insert_after(node, (node.a+node.b)//2, (node.a+node.b)//2+node.b)
    print("Datele de intrare corespund restrictiilor impuse")
             elif node.a % 2 == 1 and node.b % 2 == 1:
    node = head
                head = insert_before(head, prev, node, (node.a+node.b)//2+node.a, (node.a+node.b)//2)
    while node:
            prev = node
        print(node.a, node.b)
            node = node.next_node
        node = node.next
        node = head
        while node is not None:
            fout.write(str(node.a) + ' ' + str(node.b) + '\n')
            node = node.next_node





Latest revision as of 14:54, 3 January 2024

Cerinţa[edit | edit source]

Se dă o listă simplu înlănțuită care conține n perechi de numere naturale (a,b). Fiecare pereche este stocată în câte un nod al listei; notăm cu a primul număr stocat într-un nod și cu b al doilea număr stocat în acel nod.

Se cere să se insereze în listă astfel:

Dacă pentru nodul curent:

  • a este par și b este impar se inserează după nodul curent un nou nod, care conține dublul sumei lor pe prima poziție a nodului inserat iar pe a doua poziție diferența dintre dublul sumei numerelor din nodul curent și al doilea număr din nodul curent;
  • a este impar, b este par se inserează înaintea nodului curent un nou nod, care conține dublul sumei lor pe a doua poziție a nodului inserat și pe prima poziție diferența dintre dublul sumei numerelor din nodul curent și a primului număr din nodul curent;
  • a este par, b este par se inserează după nodul curent un nou nod, care conține jumătatea sumei lor pe prima poziție a nodului inserat iar pe a doua poziție suma dintre jumătatea sumei numerelor din nodul curent și al doilea număr din nodul curent;
  • a este impar, b este impar se inserează înaintea nodului curent un nou nod, care conține jumătatea sumei lor pe a doua poziție a nodului inserat și pe prima poziție suma dintre jumătatea sumei numerelor din nodul curent și a primului număr din nodul curent.

Date de intrare[edit | edit source]

Fișierul de intrare listin.txt conține pe prima linie numărul n, iar pe următoarele n linii n perechi de numere naturale separate prin spații.

Date de ieșire[edit | edit source]

Fișierul de ieșire listout.txt va conține pe câte o linie numerele fiecărui nod al listei separate prin spații, după realizarea inserărilor.

Restricţii şi precizări[edit | edit source]

  • 1 ⩽ n ⩽ 100.000
  • 1 ⩽ a ⩽ b ⩽ 100
  • se recomandă utilizarea unei liste alocate dinamic

Exemplul 1[edit | edit source]

listin.txt
5
1 2
2 4
1 1
2 6
7 4
listout.txt
Datele de intrare corespund restrictiilor impuse
5 6
1 2
2 4
3 7
2 1
1 1
2 6
4 10
15 22
7 4

Exemplul 2[edit | edit source]

listin.txt
100001
1 2
2 3
3 4
...
100000 100001
listout.txt
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> class Node:

   def __init__(self, a, b, next_node=None):
       self.a = a
       self.b = b
       self.next_node = next_node


def insert_after(node, a, b):

   new_node = Node(a, b, node.next_node)
   node.next_node = new_node


def insert_before(head, prev_node, node, a, b):

   new_node = Node(a, b, node)
   if prev_node is None:
       return new_node
   else:
       prev_node.next_node = new_node
       return head


def main():

   with open('listin.txt', 'r') as fin, open('listout.txt', 'w') as fout:
       n = int(fin.readline().strip())
       if n < 1 or n > 100000:
           fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
           return
       a, b = map(int, fin.readline().strip().split())
       if a < 1 or a > 100 or b < 1 or b > 100:
           fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
           return
       head = Node(a, b)
       node = head
       for _ in range(n-1):
           a, b = map(int, fin.readline().strip().split())
           if a < 1 or a > 100 or b < 1 or b > 100:
               fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
               return
           node.next_node = Node(a, b)
           node = node.next_node
       fout.write("Datele de intrare corespund restrictiilor impuse\n")
       prev = None
       node = head
       while node is not None:
           if node.a % 2 == 0 and node.b % 2 == 1:
               insert_after(node, 2*(node.a+node.b), 2*(node.a+node.b)-node.b)
           elif node.a % 2 == 1 and node.b % 2 == 0:
               head = insert_before(head, prev, node, 2*(node.a+node.b)-node.a, 2*(node.a+node.b))
           elif node.a % 2 == 0 and node.b % 2 == 0:
               insert_after(node, (node.a+node.b)//2, (node.a+node.b)//2+node.b)
           elif node.a % 2 == 1 and node.b % 2 == 1:
               head = insert_before(head, prev, node, (node.a+node.b)//2+node.a, (node.a+node.b)//2)
           prev = node
           node = node.next_node
       node = head
       while node is not None:
           fout.write(str(node.a) + ' ' + str(node.b) + '\n')
           node = node.next_node


if __name__ == "__main__":

   main()

</syntaxhighlight>