Se dă un şir de N
numere întregi. Definim costul intervalului [x, y]
, unde x
si y
apartin {1, 2, …, N}
, ca fiind suma diferenţelor dintre numărul maxim din șir, aflat în interval şi restul numerelor aflate pe pozițiile x, x+1, …, y
.
De exemplu, pentru şirul 2 4 7 4 3 -1 2 4 6
costul intervalului [3, 6]
este 15
. (explicație: 7-7+ 7-4 + 7-3 + 7+1
= 15
).
Se definesc M
operaţii de forma tip x y
, astfel: Dacă tip este 1
, atunci elementul de pe poziţia x
din șir devine y
. Dacă tip este 2
, atunci să se afişeze costul intervalului [x, y]
;
Cerința
Să se determine răspunsul pentru fiecare operaţie de tipul 2
.
Date de intrare
Fişierul de intrare intervalxy.in
conţine:
- Pe prima linie un număr natural
N
; - Pe cea de-a doua linie se află
N
numere, reprezentând elementele şirului; - Pe a treia linie se află un număr natural
M
. - Pe următoarele
M
linii se află câte un triplet tipx y
cu proprietatea din enunţ.
Date de ieșire
Fişierul de iesire intervalxy.out
conţine K
linii, reprezentând răspunsul pentru fiecare operaţie de tipul 2
, K
fiind numărul de operaţii de tip 2
din fişierul de intrare.
Restricții și precizări
2 <= N <= 100.000
1 <= M <= 100.000
-100.000 <= elementele şirului <= 100.000
- Pentru
25%
din punctaj,1 <= N <= 5.000
şi1 <= M <= 10.000
Exemplu
intervalxy.in
10 2 -4 3 7 1 -2 -1 3 5 8 6 2 1 4 1 2 0 1 4 6 1 7 3 2 4 6 2 3 8
intervalxy.out
20 13 22
Explicație
Pentru prima întrebare intervalul căutat este : 2 -4 3 7
, cu costul
(7-2)+(7+4)+(7-3)+(7-7)
= 20
Pentru a doua întrebare, intervalul căutat este: 6 1 -2
, cu costul
(6-6)+(6-1)+(6+2)
= 13
Pentru a treia întrebare, intervalul căutat este: 3 6 1 -2 3 3
, cu costul
(6-3)+(6-6)+(6-1)+(6+2)+(6-3)+(6-3)
= 22
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 Intervalxy:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,v[270001],x,y,tip,init[100005],maxim;
long long sum[270001],rez;
void UpdateARB(int nod,int destination,int st,int dr,int val)
{
if (st==dr)
{
sum[nod]=val;
v[nod]=val;
return;
}
int mij=(st+dr)/2;
if (destination<=mij) UpdateARB(nod*2,destination,st,mij,val);else
UpdateARB(nod*2+1,destination,mij+1,dr,val);
v[nod]=max(v[nod*2],v[nod*2+1]);
sum[nod]=1LL*sum[nod*2]+1LL*sum[nod*2+1];
}
void QueryARB(int nod,int st,int dr,int left,int right)
{
if (left<=st && dr<=right)
{
maxim=max(maxim,v[nod]);
rez=rez+1LL*sum[nod];
return;
}
int mij=(st+dr)/2;
if (left<=mij) QueryARB(nod*2,st,mij,left,right);
if (right>mij) QueryARB(nod*2+1,mij+1,dr,left,right);
}
int main()
{
freopen("intervalxy.in","r",stdin);
freopen("intervalxy.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&init[i]);
UpdateARB(1,i,1,n,init[i]);
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&tip,&x,&y);
if (tip==1)
{
init[x]=y;
UpdateARB(1,x,1,n,init[x]);
}else
{
rez=0;
maxim=-100001;
QueryARB(1,1,n,x,y);
rez=1LL*maxim*(y-x+1)-rez;
printf("%lld\n",rez);
}
}
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 #1591 Intervalxy
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1591 Intervalxy 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!