fbpx

Problema #2847 – List – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

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:

  1. 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;
  2. 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;
  3. 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;
  4. 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

Fișierul de intrare list.in 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

Fișierul de ieșire list.out 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

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

Exemplu

list.in

5
1 2
2 4
1 1
2 6
7 4

list.out

5 6
1 2
2 4
3 7
2 1
1 1
2 6
4 10
15 22
7 4
#include <bits/stdc++.h>
using namespace std;

ifstream cin("list.in");
ofstream cout("list.out");

int main(){
    int n, a, b;
    cin >> n;
    for(int i = 1; i <= n; ++i){
        cin >> a >> b;
        if(a % 2 == 1 && b % 2 == 0){
            cout << 2 * (a + b) - a << ' ' << 2 * (a + b) << "\n";
            cout << a << ' ' << b << "\n";
        }
        else if(a % 2 == 0 && b % 2 == 1){
            cout << a << ' ' << b << "\n";
            cout << 2 * (a + b) << ' ' << 2 * (a + b) - b << "\n";
        }
        else if(a % 2 == 0 && b % 2 == 0){
            cout << a << ' ' << b << "\n";
            cout << (a + b) / 2 << ' ' << (a + b)/2 + b << "\n";
        }
        else{
            cout << (a + b)/2 + a << ' ' << (a + b) / 2 << "\n";
            cout << a << ' ' << b << "\n";
        }
    }
}
Comentarii

S-ar putea sa iti placa