infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Daniel Pasaila din Aprilie 04, 2007, 19:47:48



Titlul: 399 Sum2
Scris de: Daniel Pasaila din Aprilie 04, 2007, 19:47:48
Aici puteţi discuta despre problema Sum2 (http://infoarena.ro/problema/sum2).


Titlul: Răspuns: 399 Sum2
Scris de: Florian Marcu din Aprilie 04, 2007, 21:40:01
Cred k nu ar strica inlocuirea lui "are" ku "ale" din enunt,,,desi pe mine nu ma deranjeaza :wink:

Apropos, ce complexitate ar trebui sa aiba un algoritm de 100? :?


Titlul: Răspuns: 399 Sum2
Scris de: Savin Tiberiu din Aprilie 07, 2007, 13:08:35
o(n), desi e posibil sa intre si n log n.


Titlul: Răspuns: 399 Sum2
Scris de: Florian Marcu din Aprilie 08, 2007, 00:23:56
Aha...mersi.. :thumbup:.o sa incep implementarea, din moment ce-mi dau seama despre ce este vb...


Titlul: Răspuns: 399 Sum2
Scris de: Gabriel Bitis din Mai 15, 2007, 15:11:06
Am facut prima data un program cu complexitate patratica pt a afla suma... luam primele 2 teste si TLE pt restul... am incercat dupa aceea o complexitate liniara, iau 70p, WA pe primele 2 si ultimul test...:-?... ce ar putea fi gresit?  ???


Later edit: am rezolvat primele doua teste.. mai e ultimul... e vre'un caz special?


Titlul: Răspuns: 399 Sum2
Scris de: Martinas Bodgan din Mai 23, 2007, 18:25:11
Nu pricep un lucru: la problema asta, subsir inseamna subsecventa [adik sir de elemente care apar pe pozitii consecutive in sirul initial ]  ?  :-s Daca nu, ar putea cineva sa-mi explice exemplul?


Titlul: Răspuns: 399 Sum2
Scris de: Gabriel Bitis din Mai 23, 2007, 18:45:58
Citat
Se da un sir de numere intregi. Se cauta un subsir cu lungimea cuprinsa intre L si U format din elemente consecutive ale sirului initial cu suma elementelor maxima.
Subsir nu inseamna sir format din elemente care apar pe pozitii consecutive in sirul initial => nu e subsecventa (asta in cazul general), dar avand in vedere ca in enunt se precizeaza ca este format din elemente consecutive, in cazul problemei Sum2 subsirul e o subsecventa. In exemplul dat, subsirul este format din ultimele 3 elemente.

Ps: poate sa imi spuna cineva c greseli pot avea astfel incat cade ultimul test.. iau doar 90 puncte si Wa pe ultimul  ](*,) .. help.. pls


Titlul: Răspuns: 399 Sum2
Scris de: Sergiu-Ioan Ungur din Aprilie 19, 2009, 16:50:03
Ceva mi se pare dubios la testele acestei probleme. Am rezolvat problema punand conditia ca secventa de suma maxima sa fie de lungime maxim u (fara sa verific daca are lungimea mai mare decat l) si am luat 100  :-k.


Titlul: Răspuns: 399 Sum2
Scris de: Emanuel Cinca din Iulie 04, 2009, 22:42:28
Poate sa-mi dea cineva o idee de rezolvare cu deque? Nu de alta, dar are link de la arhiva educationala de la problema deque  :-k

Multumesc! :wink:


Titlul: Răspuns: 399 Sum2
Scris de: Andrei Misarca din Iulie 05, 2009, 22:24:39
Ideea e sa iti faci niste sume partiale, iar pentru a afla subsecventa de suma maxima care se termina pe pozitia i, tre' sa afli cea mai mica suma partiala dintre pozitiile i-L si i-U. Si pentru a determina acea suma ai nevoie de deque. Sper ca ai inteles  :)


Titlul: Răspuns: 399 Sum2
Scris de: Marius Stroe din Iulie 05, 2009, 22:39:31
Poate sa-mi dea cineva o idee de rezolvare cu deque? Nu de alta, dar are link de la arhiva educationala de la problema deque  :-k

Multumesc! :wink:

De ce nu citește nimeni articolele? Ai aici (http://infoarena.ro/probleme-cu-secvente#problema-9) rezolvarea problemei sum2. Și dacă nu pricepi deque, mai cauți prin articole.


Titlul: Răspuns: 399 Sum2
Scris de: George Popoiu din Ianuarie 12, 2010, 15:23:33
Am citit articolul cu probleme cu subsecvente si nu prea inteleg cum sa folosesc dequeul aici. Pt fiecare i trebuie sa cautam subsecventa de suma maxima intre i-U si i-L, dar nu trebuie sa parcurgem cu un j pentru a face asta?

Daca nu e asa, imi spuneti si mie va rog cum sa fac?  :sad:


Titlul: Răspuns: 399 Sum2
Scris de: Paul-Dan Baltescu din Ianuarie 12, 2010, 15:27:38
Ideea e sa folosesti deque-ul pentru a evita parcurgerea intervalului respectiv. Gandeste-te cum l-ai putea aplica pe vectorul de sume partiale.


Titlul: Răspuns: 399 Sum2
Scris de: George Popoiu din Ianuarie 12, 2010, 22:30:08
Am gasit ceva asemanator cu problema asta in topicul de la problema Subsecventa3, dar tot nu ma prind.  :-k

Un hint referitor la ce ar trebui sa tin in Deque?


Titlul: Răspuns: 399 Sum2
Scris de: Macarescu Sebastian din Septembrie 10, 2010, 17:47:51
Cred ca trebuie inbunatatite testele. Cu sursa de 100 pt pe testul
Cod:
2 1 2
-20 -10
imi da gresit.


Titlul: Răspuns: 399 Sum2
Scris de: Iacov Adrian din Martie 03, 2011, 13:04:40
mi-ar putea da si mie cnv testele va rog:D.


Titlul: Răspuns: 399 Sum2
Scris de: Andrei Misarca din Martie 03, 2011, 14:30:07
Testele oficiale - nicio sansa.
Dar iti poti face o sursa brute-force de complexitate O(N^2) si un generator de teste, cu ajutorul carora sa iti verifici programul de complexitate optima  :)


Titlul: Răspuns: 399 Sum2
Scris de: Preda Rares Mihai din Martie 03, 2011, 15:29:04
Eu tot pun intr-un deque pana ajung la dimensiunea U si dupa aceea tot extrag primu element din deque si inserez la final mai departe si fac sp[Q.back() ] - sp[Q.front() - 1] , unde sp e vectorul de sume partiale..si iau 50 de puncte. Cred ca la un moment dat o sa aiba deque-ul doar dimensiunea U ..cum pot face fara sa parcurg deque-ul ?


Titlul: Răspuns: 399 Sum2
Scris de: Paul-Dan Baltescu din Martie 04, 2011, 00:01:50
Poate te ajuta acest articol  (http://infoarena.ro/deque-si-aplicatii)sa intelegi cum ar trebui folosit deque-ul. Trebuie facut cam acelasi lucru cu ce e descris la problemele vila sau sir, doar ca pe vectorul de sume partiale.


Titlul: Răspuns: 399 Sum2
Scris de: Preda Rares Mihai din Martie 04, 2011, 11:33:49
Multumesc mult !  Am luat 100. :banana:


Titlul: Răspuns: 399 Sum2
Scris de: FMI Ciprian Olariu din Iunie 22, 2011, 15:05:08
Poate cineva sa imi dea un indiciu macar despre cum ar trebui abordata problema(cum trebuie folosit deque cu sumele partiale)  :-k ?
Am incercat ceva variante de genul queue cu left si right,din care variantele mai dubioase care imi picau niste exemple au luat 50pct,iar varianta care trece exemplele mele si care imi pare mai in regula ia 10pct , dar bineinteles observ ca niciuna dintre ele nu poate gasi suma maxima in anumite cazuri  ](*,)

Asta ar fi o sursa de 10pct(care bineinteles nici nu foloseste practic sumele partiale decat la o banala initializare)  #-o
Cod:
        ifstream fin("sum2.in");
fin>>n>>L>>U;
for(i=1;i<=n;i++)
{
fin>>a[i];
sum[i]=sum[i-1]+a[i];
}
fin.close();
suma=sum[L];
size=L;
left=1;
right=L;
sol=sum[L];
while(right<n && left<=right)
{
if(size<U)
{
done=false;
while(a[right+1]>=0 && size<U && right<n)
{
done=true;
right++;
size++;
suma=suma+a[right];
if(size<=U && size>=L)
sol=max(sol,suma);
}
if(done==false)
{
right++;
size++;
suma=suma+a[right];
if(size<=U && size>=L)
sol=max(sol,suma);
}
}
if(size>L)
{
done=false;
while(a[left]<=0 && size>L)
{
done=true;
size--;
suma=suma-a[left];
left++;
if(size<=U && size>=L)
sol=max(sol,suma);
}
if(done==false)
{
size--;
suma=suma-a[left];
left++;
if(size<=U && size>=L)
sol=max(sol,suma);
}
}
}
ofstream fout("sum2.out");
fout<<sol<<"\n";
fout.close();
return 0;

Poate cineva sa ma ajute cu vreo idee?  :)


Titlul: Răspuns: 399 Sum2
Scris de: Valentin Harsan din Iunie 22, 2011, 15:23:02
stie cineva unde gresesc? am folosit deque cu sume partiale dar iau doar 50  ](*,)

Cod:
#include<iostream>
#include<fstream>
#define N 100004

using namespace std;

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

int n,l,U,smax=-1000000,d[N],p=1,u,y[N];
short x[N];

inline void swap(int &a, int & b) {
int t=a;
a=b;
b=t;
}

inline void add(const int &a) {
d[++u]=a;
}

inline void stanga(int i) {
if(p<=u && i - d[p]>= U)
++p;
}

inline void dreapta() {
while(u!=p && y[d[u]] <= y[d[u-1]]) {
swap(d[u],d[u-1]);
--u;
}
}

void so() {
int i;

for(i=0;i<U-l-1;++i) {
add(i);
dreapta();
}

for(i=U;i<=n;++i) {
stanga(i);
add(i-l-1);
dreapta();
if(y[i]-y[d[p]]>smax)
smax=y[i]-y[d[p]];
}
add(i-l-1);
dreapta();
if(y[i-1]-y[d[p]]>smax)
smax=y[i-1]-y[d[p]];
}

int main() {
int i;
in >> n >> l >> U;

for(i=1;i<=n;++i) {
in >> x[i];
y[i]=x[i] + y[i-1];
}

so();

out << smax;

return 0;
}


Titlul: Răspuns: 399 Sum2
Scris de: George Marcus din Iunie 22, 2011, 16:37:50
Personal, consider ca implementarea ta a Deque-ului e mult prea complicata. Iti sugerez sa faci ca in sursa oficiala de la problema din Arhiva educationala.

Si in legatura cu programul tau, el pica niste teste banale.

Cod:
2 1 2
1000 -1000

Cod:
3 1 3
1000 1000 -1000

Cod:
9 2 3
100 100 -1000 10 -15 100 100 -15 1

Cred ca el cauta doar secvente de lungime U, in loc de [L,U].


Titlul: Răspuns: 399 Sum2
Scris de: Cristian Lambru din Iunie 22, 2011, 21:47:56
Deque-ul acela pastreaza doar minimul pe intervalul [i + L - U,i], pentru fiecare i de la [0,N-L] (pozitiile negative nu se iau in seama). Cred ca asa ar fi o descriere mai usoara a problemei :) . Dupa care cu minimul respectiv si i + L cred ca stiti ce sa faceti.
Spor la treaba :) !


Titlul: Răspuns: 399 Sum2
Scris de: Valentin Harsan din Iunie 23, 2011, 09:15:22
@PlayLikeNeverB4. ai luat acum 100 cu sursa mea modificata?

am corectat niste greseli si acum iau testele tale, da tot 50 iau  ](*,) .
la al treilea trebuie sa dea 200, nu?


Titlul: Răspuns: 399 Sum2
Scris de: George Marcus din Iunie 23, 2011, 12:08:43
Ti-am modificat sursa si acum ia 100. Ti-am trimis-o prin PM.


Titlul: Răspuns: 399 Sum2
Scris de: Eugenie Daniel Posdarascu din Iunie 23, 2011, 16:28:59
Ti-am modificat sursa si acum ia 100. Ti-am trimis-o prin PM.

Ar trebui sa ii spui si ce a gresit, nu numai sa ii modifici sursa si dupa sa ii o dai. Desigur, poate ai facut asta deja dar eu doar ma asiguram.  :D


Titlul: Răspuns: 399 Sum2
Scris de: George Marcus din Iunie 23, 2011, 17:16:18
Daca are nelamuriri, va pune intrebari :) I-am zis ca nu e destul sa obtina punctajul maxim, ci sa si inteleaga programul.


Titlul: Răspuns: 399 Sum2
Scris de: UAIC.VlasCatalin din Iulie 15, 2011, 22:46:31
imi poate sugera si mie cineva care poate sa fie cauza, programul meu merge corect pe toate testele din comentarii, pe testul exemplu si pe toate testele mele, dar totusi obtin numai 10 puncte cu WA pe toate celelalte ](*,)
Eu procedez astfel:
 1. tin un vector cu sume partiale maxime;
 2. tin alt vector cu lungimile de segvente din care se obtin aceste sume partiale maxime;
 3. parcurg elementele de la 1..n, si aleg elementul care are lungimea cuprinsa intre L si U, si are valoare maxima in vectorul cu sume, acest element fiind solutia. :?


Titlul: Răspuns: 399 Sum2
Scris de: Cristian Lambru din Iulie 15, 2011, 23:01:54
Nu este chiar ok solutia :( !

Ideea e ca subsecventa de suma maxima se mai poate face si ca maximul dintre A[ i ] - cea mai mica suma partiala pe pozitii anteriaore lui i . Dupa ce observi asta poti deduce usor cum trebuie sa faci mai departe in acest caz :) .


Titlul: Răspuns: 399 Sum2
Scris de: UAIC.VlasCatalin din Iulie 15, 2011, 23:13:58
poate imi explici remarca dupa exemplu dat, pur si simplu spune terog cum trebue sa procedez in cazul dat:
vectorul : 100  -100 0 -5 0 10 0 1
v. cu sum: 100 -100 0 -5 11 11 1 1
v. cu lung:  1      1   1   1 4   3  2  1
Cam asa construesc eu vectorii pe care i-am enuntat mai sus.


Titlul: Răspuns: 399 Sum2
Scris de: Cristian Lambru din Iulie 16, 2011, 13:10:17
Sumele partiale sunt sumele de pe pozitia 1 la i:

vectorul: 100  -100 0 -5 0 10 0 1
vectorul cu sume: 100 0 0 -5 0 5 5 6

Subsecventa de suma maxima ce se termina pe pozitia i = 8 :) este:
ssm[ 8 ] = Sum[ 8 ] - min(Sum[8],Sum[7] ... Sum[1]) = 6 - (-5) = 11, ceea ce si este :) !

ssm pentru fiecare: 100 0 0 -5 0 10 10 11

Acum ar trebui sa fie usor sa deduci cum se rezolva problema :)!


Titlul: Răspuns: 399 Sum2
Scris de: UAIC.VlasCatalin din Iulie 16, 2011, 15:22:20
ms mult Andrei Cristian, explicatia ta chiar m-a ajutat inca nu am luat punctaj maxim dar oricum sunt multumit ca am scapat de WA, acum sunt sigur ca merg pe o abordare corecta si trebue doar sa ma gindesc la optimizari. :peacefingers:


Titlul: Răspuns: 399 Sum2
Scris de: UAIC.VlasCatalin din Iulie 16, 2011, 19:01:17
stiu ca deja sunt plictisitor, dar mai am o ultima intrebare; mai este ceva special la aceasta problema? am facut optimizarile necesare si imi intra toate testele in timp, numai ca totusi am WA pe 3 teste, am mai vazut in surse asa situatii, cei care au rezolvat aceasta problema poate imi spuneti si mie, despre ce este vorba ](*,)


Titlul: Răspuns: 399 Sum2
Scris de: Tudor Tiplea din Ianuarie 03, 2012, 17:03:14
Cred ca ar trebui imbunatatite testele pentru ca cu o sursa de 100 p pe testul:
3 3 3
10 -1000 10000
 imi da raspunsul 10000.


Titlul: Răspuns: 399 Sum2
Scris de: Alexandru-Iancu Caragicu din Noiembrie 01, 2012, 20:22:56
Un subsir format din elemente consecutive ale sirului initial nu e o subsecventa?


Titlul: Răspuns: 399 Sum2
Scris de: George Marcus din Noiembrie 01, 2012, 21:01:09
Ba da, dar daca o formulezi asa atunci nu mai trebuie sa explici ce e o subsecventa. Poate de aceea e scris asa.


Titlul: Răspuns: 399 Sum2
Scris de: theo .c din Februarie 20, 2013, 00:47:54
E o mica problema cu testele. Am trimis o sursa in care nu tineam cont de lungimea minima a secventei si am luat 100 :-'


Titlul: Răspuns: 399 Sum2
Scris de: Nicu B. din Martie 07, 2013, 11:43:12
Iau 90 puncte cu WA pe testul 8. Folosesc un multiset in care bag la fiecare pas s[i+U-1] si scot s[i+L-2] (s fiind sume partiale). Nu inteleg ce ar putea fi gresit :-??.


Titlul: Răspuns: 399 Sum2
Scris de: George Marcus din Martie 07, 2013, 17:47:28
Nu tratezi cazul in care maximul e un numar negativ.  :P


Titlul: Răspuns: 399 Sum2
Scris de: Nicu B. din Martie 07, 2013, 17:52:45
Intr-adevar, dar se pare ca nu asta e problema. Am initializat maxim cu maxim=-10000000000000LL; si tot WA iau. Mersi pentru raspunsul prompt oricum :D


Titlul: Răspuns: 399 Sum2
Scris de: George Marcus din Martie 07, 2013, 18:04:06
O alta problema pe care o ai e ca tu verifici maximul doar daca poti sa adaugi un element nou in dreapta, dar nu tratezi subsecventele mai scurte. Vezi testul asta

Cod:
5 2 4
-1000 -1000 -1000 1000 1000


Titlul: Răspuns: 399 Sum2
Scris de: Nicu B. din Martie 07, 2013, 18:10:34
Asta era! Mersi mult :D


Titlul: Răspuns: 399 Sum2
Scris de: alex cuturela din Martie 29, 2013, 12:51:11
60 pe wrong answer. Aparent am uitat un caz. ](*,) ](*,)


Titlul: Răspuns: 399 Sum2
Scris de: Ursu Ianis Vlad din August 11, 2019, 08:14:49
Nu înțeleg de ce iau doar 50p  ](*,) ....
Eu am rezolvat problema așa,  mențin suma curentă și un deque în care introduc elementele în ordinea în care le citesc. Când citesc al i-lea element îl introduc în suma curentă și în deque și urmează cazurile:
- dacă lungimea deque-ului devine mai mare ca U atunci elimin obligatoriu primul element și fac update la sumă, compar cu suma maximă;
- dacă lungimea deque-ului este fix L atunci compar cu suma maximă;
- dacă lungimea deque-ului este mai mare decât L, atunci verific dacă eliminarea primului element din deque ar aduce o îmbunătățire la sumă. dacă da atunci fac update la sumă și elimin elementul; indiferent compar cu suma maximă.

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

ifstream fin("sum2.in");
ofstream fout("sum2.out");

int n, l, u, x, s{0}, smax {INT_MIN};

deque<int> dq;

int main()
{
    fin>>n>>l>>u;

    for(int i=1; i<=n; i++){
        fin >> x;

        dq.push_back(x);
        s += x;

        if(dq.size() > u) {
            s -= dq.front();
            dq.pop_front();
            if(s > smax) smax = s;
        }

        if(dq.size() == l){
            if(s > smax) smax = s;
        }

        if(dq.size() > l){
            if(s - dq.front() > s) {
                s -= dq.front();
                dq.pop_front();

            }

            if(s > smax) smax = s;
        }
    }

    fout<<smax;
}