Energy Release
Ch round #45-Alan has some traps IIIDescription
Alan gets an ore consisting of an energy crystal. for each energy crystal in the ore, if a chemical substance is used to stimulate an energy crystal, it can release energy.
The energy release strength is related to the energy value of the crystal and the position of the crystal.
Alan made the following definitions to facilitate research.
Energy set: a collection of the first energy crystal in an ore to the first energy crystal (including and.
Energy Storage point: for the Energy crystals and, if any, an ore is called an energy storage point.
Energy Release point: in an energy concentration, if an energy crystal exists, all the energy crystals except it are its energy storage points, the energy crystal is the energy point of the energy set.
Energy Release strength: For an energy release point in an energy concentration, to stimulate this energy crystal, other energy crystals in the energy concentration will release energy. The energy release intensity of this energy set is equal to the maximum difference between the energy values of other energy crystals in this energy set and the energy values of the energy release points. The energy release strength of the first energy crystal is the maximum energy release strength of all energy sets.
Alan will give the number of Energy crystals in the ore and the energy value of each energy crystal, asking you to find the energy release strength of each energy crystal.
Input Format
The first line is an integer that represents the number of Energy crystals in the ore.
The second line is an integer that represents the energy value of the first energy crystal.
Output Format
Contains only one integer. The first integer indicates the energy release strength of the first energy crystal.
Sample Input
53 2 1 2 3
Sample output
0 1 2 1 0
Data scope and conventions
- For 20% of data :.
- For 60% of data :.
- For 100% of data :.
- Reminder: The data volume of this question is large. Please try your best to use input/output optimization.
Question:
In the test room, I wrote a monotonous queue of O (N) (which is actually equivalent to a monotonous stack ...) + O (nlogn) rmq
The result is only half of the result.
Later, I realized that if the data size reaches more than one million, I would have to use the O (n) algorithm. I am still too young...
I used a monotonous queue when I was preparing to perform the noi2005 magnificent waltz today. I suddenly had an idea about this question and I would like to do it again.
This time, my algorithm should be O (n... I think so...
In fact, considering that if the element on the left of a [I] is smaller than a [J], then the scope of J's jurisdiction I can also be (J's initial value is i-1)
Therefore, we can directly jump to the left of J's Jurisdiction Scope, that is, j = L [J]-1, and use it to update f [I] at the same time.
When the last hop fails, J + 1 is L [I]
The right side is similar...
I don't know how complex it is? How to estimate? Please advise
Self-testing times out slightly, and the last few points are about 1.2s.
Code:
1. It takes 22 s to finish all the data in the test room.
1 var i,j,n,h,t:longint; 2 f:array[0..2000000+10,0..20] of longint; 3 a,q,l,r:array[0..2000000+10] of longint; 4 procedure init; 5 begin 6 readln(n); 7 for i:=1 to n do read(a[i]); 8 end; 9 procedure queue;10 begin11 a[0]:=-2100000000;a[n+1]:=a[0];12 fillchar(q,sizeof(q),0);13 h:=0;t:=0;14 for i:=1 to n+1 do15 begin16 while (h<t) and (a[i]<a[q[t]]) do17 begin18 r[q[t]]:=i-1;19 dec(t);20 end;21 inc(t);q[t]:=i;22 end;23 fillchar(q,sizeof(q),0);24 h:=0;t:=0;25 for i:=n downto 0 do26 begin27 while (h<t) and (a[i]<a[q[t]]) do28 begin29 l[q[t]]:=i+1;30 dec(t);31 end;32 inc(t);q[t]:=i;33 end;34 end;35 function max(x,y:longint):longint;36 begin37 if x>y then exit(x) else exit(y);38 end;39 40 procedure rmq;41 begin42 fillchar(f,sizeof(f),127);43 for i:=1 to n do f[i,0]:=a[i];44 for i:=1 to 22 do45 begin46 if (1<<i)>n then break;47 for j:=1 to n-(1<<i)+1 do48 f[j,i]:=max(f[j,i-1],f[j+1<<(i-1),i-1]);49 end;50 end;51 function query(x,y:longint):int64;52 var k:longint;53 begin54 k:=trunc(ln(y-x+1.0)/ln(2.0));55 exit(max(f[x,k],f[y-(1<<k)+1,k]));56 end;57 58 procedure main;59 begin60 queue;61 rmq;62 // for i:=1 to n do writeln(l[i],‘ ‘,r[i]);63 for i:=1 to n do64 write(query(l[i],r[i])-a[i],‘ ‘);65 end;66 begin67 assign(input,‘input.txt‘);assign(output,‘output.txt‘);68 reset(input);rewrite(output);69 init;70 main;71 close(input);close(output);72 end.73
View code
2.20140806 it takes 6 s to run all the data
1 {$inline on} 2 const maxn=2000000+100; 3 var l,r,a,f:array[0..maxn] of longint; 4 i,n,j:longint; 5 function max(x,y:longint):longint;inline; 6 begin 7 if x>y then exit(x) else exit(y); 8 end; 9 10 procedure init;11 begin12 readln(n);13 for i:=1 to n do begin read(a[i]);f[i]:=a[i];end;14 end;15 procedure main;16 begin17 a[0]:=-maxlongint;a[n+1]:=-maxlongint;18 l[1]:=1;19 for i:=2 to n do20 begin21 j:=i-1;22 while a[i]<=a[j] do23 begin24 if f[j]>f[i] then f[i]:=f[j];25 j:=l[j]-1;26 end;27 l[i]:=j+1;28 end;29 r[n]:=n;30 for i:=n-1 downto 1 do31 begin32 j:=i+1;33 while a[i]<=a[j] do34 begin35 if f[j]>f[i] then f[i]:=f[j];36 j:=r[j]+1;37 end;38 r[i]:=j-1;39 end;40 for i:=1 to n-1 do write(f[i]-a[i],‘ ‘);writeln(f[n]-a[n]);41 end;42 begin43 assign(input,‘input.txt‘);assign(output,‘output.txt‘);44 reset(input);rewrite(output);45 init;46 main;47 close(input);close(output);48 end.
View code