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:
a
este par șib
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
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 .
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!