poj 1177/USACO 5.5 Picture 线段树+离散化+扫描线
来源:互联网 发布:js获取页面停留时间 编辑:程序博客网 时间:2024/06/04 22:09
题意:给出n个矩形,若某条边的一段被某个矩形覆盖,则这一段就会消失,求剩下的边的总长度。
分析:仍然要用到扫描线,跟hdu 1255有点类似。因为要统计的边分为横的和竖的,所以就分两次统计。
其他的操作和hdu 1255的基本相同,只是统计的时候变了一些而已,具体的看代码。
代码:
{ID: ymwbegi1PROG: pictureLANG: PASCAL}var n,a1,i:longint; x1,y1,x2,y2:array[1..5000] of real; s,ans:real; t:array[1..10000,1..4] of longint; a:array[0..10000] of real; bian:array[0..10000,1..3] of real; b:array[0..10000] of longint;procedure qsort1(l,r:longint);var i,j:longint; k,w:real;begin if l>=r then exit; i:=l; j:=r; k:=bian[(i+j) div 2,1]; w:=b[(l+r) div 2]; repeat while (bian[i,1]<k)or(bian[i,1]=k)and(b[i]>w) do inc(i); while (bian[j,1]>k)or(bian[j,1]=k)and(b[j]<w) do dec(j); if i<=j then begin bian[0]:=bian[i];bian[i]:=bian[j];bian[j]:=bian[0]; b[0]:=b[i];b[i]:=b[j];b[j]:=b[0]; inc(i);dec(j); end; until i>j; qsort1(i,r); qsort1(l,j);end;procedure qsort2(l,r:longint);var i,j:longint; k:real;begin if l>=r then exit; i:=l; j:=r; k:=a[(i+j) div 2]; repeat while a[i]<k do inc(i); while a[j]>k do dec(j); if i<=j then begin a[0]:=a[i];a[i]:=a[j];a[j]:=a[0]; inc(i);dec(j); end; until i>j; qsort2(i,r); qsort2(l,j);end;procedure hehe(d,l,r:longint);var m:longint;begin t[d,1]:=l; t[d,2]:=r; t[d,3]:=0; t[d,4]:=0; if r-l=1 then exit; m:=(l+r) div 2; hehe(d*2,l,m); hehe(d*2+1,m,r);end;procedure insert(d:longint;l,r:real;z:longint);var m:longint;begin m:=(t[d,1]+t[d,2]) div 2; if (a[t[d,1]]=l)and(a[t[d,2]]=r) then begin if t[d,4]=0 then begin t[d,4]:=2; t[d,3]:=t[d,3]+z; if (t[d,3]=0)or(t[d,3]=z) then ans:=ans+r-l; end else if t[d,4]=1 then begin insert(d*2,l,a[m],z); insert(d*2+1,a[m],r,z); end else begin t[d,3]:=t[d,3]+z; if (t[d,3]=0)or(t[d,3]=z) then ans:=ans+r-l; end; exit; end; if t[d,4]=2 then begin t[d*2,4]:=2; t[d*2+1,4]:=2; t[d*2,3]:=t[d*2,3]+t[d,3]; t[d*2+1,3]:=t[d*2+1,3]+t[d,3]; end; t[d,4]:=1; if r<=a[m] then insert(d*2,l,r,z) else if l>=a[m] then insert(d*2+1,l,r,z) else begin insert(d*2,l,a[m],z); insert(d*2+1,a[m],r,z); end;end;procedure work1;begin for i:=1 to n do begin bian[i*2-1,1]:=y1[i]; bian[i*2-1,2]:=x1[i]; bian[i*2-1,3]:=x2[i]; b[i*2-1]:=1; bian[i*2,1]:=y2[i]; bian[i*2,2]:=x1[i]; bian[i*2,3]:=x2[i]; b[i*2]:=-1; a[i*2-1]:=x1[i]; a[i*2]:=x2[i]; end; qsort1(1,n*2); qsort2(1,n*2); a1:=n*2; for i:=1 to n*2-1 do if a[i]=a[i+1] then begin a[i]:=maxlongint div 10; dec(a1); end; qsort2(1,n*2); hehe(1,1,a1); i:=1; bian[0,1]:=-1; bian[n*2+1,1]:=-1; while i<=n*2 do begin insert(1,bian[i,2],bian[i,3],b[i]); while bian[i,1]=bian[i+1,1] do begin inc(i); insert(1,bian[i,2],bian[i,3],b[i]); end; inc(i); end;end;procedure work2;begin for i:=1 to n do begin bian[i*2-1,1]:=x1[i]; bian[i*2-1,2]:=y1[i]; bian[i*2-1,3]:=y2[i]; b[i*2-1]:=1; bian[i*2,1]:=x2[i]; bian[i*2,2]:=y1[i]; bian[i*2,3]:=y2[i]; b[i*2]:=-1; a[i*2-1]:=y1[i]; a[i*2]:=y2[i]; end; qsort1(1,n*2); qsort2(1,n*2); a1:=n*2; for i:=1 to n*2-1 do if a[i]=a[i+1] then begin a[i]:=maxlongint div 10; dec(a1); end; qsort2(1,n*2); hehe(1,1,a1); i:=1; bian[0,1]:=-1; bian[n*2+1,1]:=-1; while i<=n*2 do begin insert(1,bian[i,2],bian[i,3],b[i]); while bian[i,1]=bian[i+1,1] do begin inc(i); insert(1,bian[i,2],bian[i,3],b[i]); end; inc(i); end;end;begin assign(input,'picture.in'); assign(output,'picture.out'); reset(input); rewrite(output); readln(n); for i:=1 to n do readln(x1[i],y1[i],x2[i],y2[i]); ans:=0; work1; work2; writeln(ans:0:0); close(input); close(output);end.
0 0
- poj 1177/USACO 5.5 Picture 线段树+离散化+扫描线
- poj 1177 Picture 线段树+离散化+线扫描
- POJ 1177 Picture (线段树+离散化+扫描线) 详解
- picture 1177 poj 线段树+扫描线+离散化
- POJ 1177 Picture [离散化+扫描线+线段树]
- POJ 1177-Picture(线段树+离散化+扫描线)
- HDU 1828 && POJ 1177 Picture(线段树+扫描线+离散化)
- poj 1177 picture(线段树+扫描线+离散化)★
- POJ 1177 Picture (线段树扫描线)
- Picture 线段树 扫描线 Usaco
- poj1177 Picture 扫描线+线段树+离散化
- poj1177 Picture 线段树+扫描线+离散化
- HDU 1828 Picture (线段树+扫描线+离散化)
- 【POJ1177】Picture-线段树+离散化+扫描线
- poj - 1177 - Picture(离线化+扫描线+线段树)
- poj 1177 / hdu 1828 线段树 离散化 扫描线
- Poj 1177线段树 离散化 扫描线
- poj 1177 & hdu 1828 Picture(线段树+离散化)
- spring配置计时器
- 企业网站建设需要注意的事项
- python 使用相对路径import 模块的方法
- Leetcode 71. Simplify Path
- xp中搭建php环境(安装apache并配置apache)
- poj 1177/USACO 5.5 Picture 线段树+离散化+扫描线
- Minor GC、Major GC和Full GC之间的区别
- KMDF中未分页内存的类型选择
- Spring MVC启动——initStrategies
- 【区间型DP】石子归并问题
- 提高 Linux 上 socket 性能
- +load +initialize
- Java基础学习总结(28)——Java对各种排序算法的实现
- 动画学习 三