02/10/2018, 13:57
QMAX2 spoj – Giá trị lớn nhất ver2
Nguồn đề bài: http://vn.spoj.com/problems/QMAX2/ 1. Đề bài QMAX2 spoj Giống bài “Giá trị lớn nhất” ở trên. Input – n: số phần tử của dãy (n <= 50000). – m: số lượng biến đổi và câu hỏi (m <= 100000). +) biến đổi có dạng: 0 x y value +) câu hỏi có dạng : 1 ...
Nguồn đề bài: http://vn.spoj.com/problems/QMAX2/
1. Đề bài QMAX2 spoj
Giống bài “Giá trị lớn nhất” ở trên.
Input
– n: số phần tử của dãy (n <= 50000).
– m: số lượng biến đổi và câu hỏi (m <= 100000).
+) biến đổi có dạng: 0 x y value
+) câu hỏi có dạng : 1 x y.
Output
Ghi ra trả lời cho lần lượt từng câu hỏi.
Example
Input:
6 3
0 1 3 3
0 4 6 4
1 1 6
Output:
4
2. code tham khảo QMAX2 spoj
a. Code pascal
uses math;
const fi=';
nmax=50001;
type data=longint;
var
f:text;
add,t:array[0..nmax*5] of data;
n,m:data;
procedure down(i,trai,phai:data);
begin
inc(add[trai],add[i]);
inc(add[phai],add[i]);
inc(t[trai],add[i]);
inc(t[phai],add[i]);
add[i]:=0;
end;
procedure update(i,l,r,u,v,c:data);
var mid:data;
begin
if (l=u) and (v=r) then
begin
inc(add[i],c);
inc(T[i],c);
exit;
end
else
if (r<u) or (v<l) then
exit;
mid:=(l+r) div 2;
down(i,i*2,i*2+1);
update(i*2,l,mid,u,min(v,mid),c);
update(i*2+1,mid+1,r,max(mid+1,u),v,c);
T[i]:=max(t[i*2],t[i*2+1]);
end;
function timmax(i,l,r,u,v:data):data;
var mid,maxtrai,maxphai:data;
begin
if (l=u) and (v=r) then
exit(T[i]);
if (r<u) or (v<l) then
exit(0);
mid:=(l+r) div 2;
down(i,i*2,i*2+1);
maxtrai:=timmax(i*2,l,mid,u,min(mid,v));
maxphai:=timmax(i*2+1,mid+1,r,max(mid+1,u),v);
exit(max(maxtrai,maxphai));
end;
procedure xuli;
var i,u,v,c,ch:data;
begin
assign(f,fi); reset(f);
readln(f,n,m);
for i:=0 to n do
begin
t[i]:=0;
add[i]:=0;
end;
for i:=1 to m do
begin
read(f,ch);
if ch=0 then
begin
readln(f,u,v,c);
update(1,1,n,u,v,c);
end
else
begin
readln(f,u,v);
writeln(timmax(1,1,n,u,v));
end;
end;
close(f);
end;
begin
xuli;
end.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | uses math; const fi='; nmax=50001; type data=longint; var f:text; add,t:array[0..nmax*5] of data; n,m:data; procedure down(i,trai,phai:data); begin inc(add[trai],add[i]); inc(add[phai],add[i]); inc(t[trai],add[i]); inc(t[phai],add[i]); add[i]:=0; end; procedure update(i,l,r,u,v,c:data); var mid:data; begin if (l=u) and (v=r) then begin inc(add[i],c); inc(T[i],c); exit; end else if (r<u) or (v<l) then exit; mid:=(l+r) div 2; down(i,i*2,i*2+1); update(i*2,l,mid,u,min(v,mid),c); update(i*2+1,mid+1,r,max(mid+1,u),v,c); T[i]:=max(t[i*2],t[i*2+1]); end; function timmax(i,l,r,u,v:data):data; var mid,maxtrai,maxphai:data; begin if (l=u) and (v=r) then exit(T[i]); if (r<u) or (v<l) then exit(0); mid:=(l+r) div 2; down(i,i*2,i*2+1); maxtrai:=timmax(i*2,l,mid,u,min(mid,v)); maxphai:=timmax(i*2+1,mid+1,r,max(mid+1,u),v); exit(max(maxtrai,maxphai)); end; procedure xuli; var i,u,v,c,ch:data; begin assign(f,fi); reset(f); readln(f,n,m); for i:=0 to n do begin t[i]:=0; add[i]:=0; end; for i:=1 to m do begin read(f,ch); if ch=0 then begin readln(f,u,v,c); update(1,1,n,u,v,c); end else begin readln(f,u,v); writeln(timmax(1,1,n,u,v)); end; end; close(f); end; begin xuli; end. |
b. Code c++
//#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <bitset>
using namespace std;
int n,m,res;
vector<int> T,F;
void Init()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
ios_base::sync_with_stdio(false);
scanf("%d%d",&n,&m);
F.resize(8*n + 5);
T.resize(8*n + 5);
}
void Update(int k, int l, int r, int x, int y, int value)
{
if(T[k]!=0)
{
F[k]+=T[k];
T[2*k]+=T[k];
T[2*k+1]+=T[k];
T[k]=0;
}
if(l>y || r<x) return;
if(x<=l && y>=r)
{
F[k]+=value;
T[2*k]+=value;
T[2*k+1]+=value;
T[k]=0;
return;
}
int m=(l+r)/2;
Update(2*k,l,m,x,y,value);
Update(2*k+1,m+1,r,x,y,value);
F[k]=max(F[2*k],F[2*k+1]);
}
void Query(int k, int l, int r, int x, int y)
{
if(T[k]!=0)
{
F[k]+=T[k];
T[2*k]+=T[k];
T[2*k+1]+=T[k];
T[k]=0;
}
if(l>y || r<x) return;
if(x<=l && r<=y)
{
res=max(res,F[k]);
return;
}
int m=(l+r)/2;
Query(2*k,l,m,x,y);
Query(2*k+1,m+1,r,x,y);
F[k]=max(F[2*k],F[2*k+1]);
}
void Solve()
{
while(m--)
{
int type;
scanf("%d",&type);
if(type==0)
{
int x,y,value;
scanf("%d%d%d",&x,&y,&value);
Update(1,1,n,x,y,value);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
res=0;
Query(1,1,n,x,y);
printf("%dn",res);
}
}
}
int main()
{
Init();
Solve();
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | //#include <bits/stdc++.h> #include <iostream> #include <algorithm> #include <string> #include <cstdlib> #include <cstdio> #include <vector> #include <stack> #include <queue> #include <deque> #include <cmath> #include <bitset> using namespace std; int n,m,res; vector<int> T,F; void Init() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif ios_base::sync_with_stdio(false); scanf("%d%d",&n,&m); F.resize(8*n + 5); T.resize(8*n + 5); } void Update(int k, int l, int r, int x, int y, int value) { if(T[k]!=0) { F[k]+=T[k]; T[2*k]+=T[k]; T[2*k+1]+=T[k]; T[k]=0; } if(l>y || r<x) return; if(x<=l && y>=r) { F[k]+=value; T[2*k]+=value; T[2*k+1]+=value; T[k]=0; return; } int m=(l+r)/2; Update(2*k,l,m,x,y,value); Update(2*k+1,m+1,r,x,y,value); F[k]=max(F[2*k],F[2*k+1]); } void Query(int k, int l, int r, int x, int y) { if(T[k]!=0) { F[k]+=T[k]; T[2*k]+=T[k]; T[2*k+1]+=T[k]; T[k]=0; } if(l>y || r<x) return; if(x<=l && r<=y) { res=max(res,F[k]); return; } int m=(l+r)
Có thể bạn quan tâm
0
|