Rezolvare completă PbInfo #2847 List

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

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema List:

#include<bits/stdc++.h>
using namespace std;

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

list<pair<int, int>> v;
list<pair<int, int>>::iterator it;
list<pair<int, int>>::reverse_iterator itt=v.rbegin();

int main()
{
    pair<int, int> p;
    int n,a,b;
    in>>n;
    for(int i=1;i<=n;i++)
    {
        in>>a>>b;
        p=make_pair(a,b);
        v.push_back(p);
        if(p.first%2==0  && p.second%2)
        {
            p=make_pair((a+b)*2,(a+b)*2-p.second);
            v.push_back(p);
        }
        else
        if(p.first%2  && p.second%2==0)
        {
            p=make_pair((a+b)*2-p.first,(a+b)*2);
            itt=v.rbegin();
            itt++;
            v.insert(itt.base(),p);
        }
        else
        if(p.first%2==0  && p.second%2==0)
        {
            p=make_pair((a+b)/2,(a+b)/2+p.second);
            v.push_back(p);
        }
        else
        if(p.first%2  && p.second%2)
        {
            p=make_pair((a+b)/2+p.first,(a+b)/2);
            itt=v.rbegin();
            itt++;
            v.insert(itt.base(),p);
        }
    }
    for(it=v.begin();it!=v.end();it++)
        out<<it->first<<" "<<it->second<<'\n';
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2847 List

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2847 List de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!