1540. 【USACO Open 2012铜】岛屿Islands (File IO): input:islands.in output:islands.out 时间限制: 1000 ms 空间限制: 131072 KB 具体限制 Goto ProblemSet 题目描述 每当下雨时,FJ的牧场都会进水。由于牧场地面高低不平,被水淹没的地方不是很统一,形成一些岛屿。 FJ的牧场可描述成一个一维的地形图,由N(1 <= N <= 100,000)个彼此相连的柱状的高度值组成。高度值为H(1)...H(n)。假定这个地形图的两端有两条无限高的墙围着。 当雨一直下时,地形图上最低的区域先被水淹没,形成一些不相邻的岛屿。一旦水面高度到达一个区域的高度,则认为这个区域被淹没。 左图,在当前水面时,有4个岛屿。右图,在水面升高后,剩下2个岛屿。显然,最终所有的区域都会沉入水面。 算出当雨从开始下到最后所有岛屿沉入水中,最多时可形成多少个岛屿。 输入 第1行:1个整数N 第2..N+1行:每行一个整数,表示一个区域的高度H(i). (1 <= H(i) <= 1,000,000,000) 输出 第1行: 1个整数,表示最多时能看到的岛屿数 样例输入 8 3 5 2 3 1 4 2 3 样例输出 4 数据范围限制 uses math; var v:array [0..100000,1..3] of longint; i,j,a,b,c,ans,ans1:longint; procedure ss(l,r:longint); var i,j,mid:longint; begin i:=l; j:=r; mid:=v[(l+r) div 2,1]; while i<j do begin while (v[i,1]<mid) do inc(i); while (v[j,1]>mid) do dec(j); if i<=j then begin v[0,1]:=v[i,1]; v[i,1]:=v[j,1]; v[j,1]:=v[0,1]; v[0,2]:=v[i,2]; v[i,2]:=v[j,2]; v[j,2]:=v[0,2]; inc(i); dec(j); end; end; if i<r then ss(i,r); if l<j then ss(l,j); end; begin assign(input,'islands.in'); reset(input); assign(output,'islands.out'); rewrite(output); readln(a); for i:=1 to a do begin read(c); if (c<>v[b,3]) then begin inc(b); v[b,3]:=c; v[b,2]:=b; end; end; for i:=0 to 100000 do v[i,1]:=v[i,3]; ans:=1; ss(1,b); for i:=1 to b do begin if (v[v[i,2]-1,3]>v[v[i,2],3])and(v[v[i,2]+1,3]>v[v[i,2],3])then inc(ans); if (v[v[i,2]-1,3]<=v[v[i,2],3])and(v[v[i,2]+1,3]<=v[v[i,2],3])then dec(ans); ans1:=max(ans1,ans); end; writeln(ans1); close(input); close(output); end.