Показать все ветки Спрятать все ветки Показать все сообщения Спрятать все сообщения | Just like then 2D of 1019 (broken English) | Lucky | 1147. Цветная бумага | 26 янв 2003 09:55 | 1 | | My alogorythm is O(n^2*log n), and I get Time Limit. Could anyone help me ? (+) | shitty.Mishka | 1147. Цветная бумага | 30 сен 2002 22:38 | 5 | Here's my program: Program ShapingRegions; Const Max=1000;MaxB=10000; MaxC=2500; Type TRec=Record X1,Y1,X2,Y2,C:Longint; End; Var a,b,n,i:Longint; r:Array[0..Max] Of TRec; cy,cx,dy,dx:Array[1..3*Max] Of Longint; nx,ny:Longint; hy:Array[1..MaxB] Of Boolean; nc:Array[1..MaxC] Of Longint; lasty,lastx:Longint; pres:Array[0..Max] Of Longint; pr,pl:Array[0..Max+5] Of Longint; co,cp,ac,ad:Array[1..3*Max] Of Longint; hx:Array[0..3*Max] Of Boolean; Procedure ReadData; Var i:Longint; Begin Read(a,b,n); With r[0] Do Begin x1:=0; y1:=0; x2:=a; y2:=b; c:=1; End; For i:=1 To n Do With r[i] Do Read(x1,y1,x2,y2,c); End; Procedure AddY(y:Longint); Begin If ((y>=1) And (y<=b)) Then If Not hy[y] Then Begin hy[y]:=True; Inc(ny); cy[ny]:=y; End; End; Procedure SortY(x,y:Longint); Var z:Longint; Procedure Merge; Var p,p1,p2:Longint; Begin p1:=x; p2:=z+1; p:=0; While ((p1<=z) Or (p2<=y)) Do Begin Inc(p); If p1<=z Then Begin dy[p]:=cy[p1]; Inc(p1); If p2<=y Then If cy[p2]<dy[p] Then Begin dy[p]:=cy[p2]; Inc(p2); Dec(p1); End; End Else Begin dy[p]:=cy[p2]; Inc(p2); End; End; For p:=x To y Do cy[p]:=dy[p-x+1]; End; Begin If x<y Then Begin z:=(x + y) Div 2; SortY(x,z); SortY(z+1,y); Merge; End; End; Procedure SortX(x,y:Longint); Var z:Longint; Procedure Merge; Var p,p1,p2:Longint; Begin p1:=x; p2:=z+1; p:=0; While ((p1<=z) Or (p2<=y)) Do Begin Inc(p); If p1<=z Then Begin dx[p]:=cx[p1]; cp[p]:=co[p1]; ad[p]:=ac[p1]; Inc(p1); If p2<=y Then If cx[p2]<dx[p] Then Begin dx[p]:=cx[p2]; cp[p]:=co[p2]; ad[p]:=ac[p2]; Inc(p2); Dec(p1); End; End Else Begin dx[p]:=cx[p2]; cp[p]:=co[p2]; ad[p]:=ac[p2]; Inc(p2); End; End; For p:=x To y Do Begin cx[p]:=dx[p-x+1]; co[p]:=cp[p-x+1]; ac[p]:=ad[p-x+1]; End; End; Begin If x<y Then Begin z:=(x + y) Div 2; SortX(x,z); SortX(z+1,y); Merge; End; End; Procedure AddX(x,act,col:Longint); Begin If ((x>=0) And (x<=a)) Then Begin Inc(nx); cx[nx]:=x; co[nx]:=col; ac[nx]:=act; End; End; Procedure SolveLine(y,k:Longint); Var i:Longint; Function First:Longint; Var x,y,z:Longint; Begin x:=0; y:=n; Repeat z:=(x+y) Div 2; If pr[z]>0 Then x:=z Else If pres[z]>0 Then Begin First:=z; Exit; End Else y:=z; Until y-x<=1; If pres[y]>0 Then First:=y Else If pres[x]>0 Then First:=x End; Procedure Add(v:Longint); Var x,y,z:Longint; Begin Inc(pres[v]); x:=0; y:=n; Repeat z:=(x+y) Div 2; If z=v Then Exit; If v>z Then Begin Inc(pr[z]); x:=z; End Else Begin Inc(pl[z]); y:=z; End; Until y-x<=1; End; Procedure Del(v:Longint); Var x,y,z:Longint; Begin Dec(pres[v]); x:=0; y:=n; Repeat z:=(x+y) Div 2; If z=v Then Exit; If v>z Then Begin Dec(pr[z]); x:=z; End Else Begin Dec(pl[z]); y:=z; End; Until y-x<=1; End; Begin nx:=0; For i:=0 To n Do With r[i] Do If ((y1<y) And (y2>=y)) Then Begin AddX(x1,1,i); AddX(x2,0,i); End; SortX(1,nx); lastx:=0; FillChar(hx,SizeOf(hx),False); FillChar(pres,SizeOf(pres),0); lastx:=0; hx[0]:=True; For i:=1 To nx Do Begin If Not hx[cx[i]] Then Inc(nc[r[First].C],k*(cx[i]-lastx)); > Here's my program: > Program ShapingRegions; > Const Max=1000;MaxB=10000; MaxC=2500; > Type TRec=Record > X1,Y1,X2,Y2,C:Longint; > End; > Var a,b,n,i:Longint; > r:Array[0..Max] Of TRec; > cy,cx,dy,dx:Array[1..3*Max] Of Longint; > nx,ny:Longint; > hy:Array[1..MaxB] Of Boolean; > nc:Array[1..MaxC] Of Longint; > lasty,lastx:Longint; > pres:Array[0..Max] Of Longint; > pr,pl:Array[0..Max+5] Of Longint; > co,cp,ac,ad:Array[1..3*Max] Of Longint; > hx:Array[0..3*Max] Of Boolean; > Procedure ReadData; > Var i:Longint; > Begin > Read(a,b,n); > With r[0] Do Begin > x1:=0; > y1:=0; > x2:=a; > y2:=b; > c:=1; > End; > For i:=1 To n Do > With r[i] Do > Read(x1,y1,x2,y2,c); > End; > Procedure AddY(y:Longint); > Begin > If ((y>=1) And (y<=b)) Then > If Not hy[y] Then Begin > hy[y]:=True; > Inc(ny); > cy[ny]:=y; > End; > End; > Procedure SortY(x,y:Longint); > Var z:Longint; > Procedure Merge; > Var p,p1,p2:Longint; > Begin > p1:=x; p2:=z+1; p:=0; > While ((p1<=z) Or (p2<=y)) Do Begin > Inc(p); > If p1<=z Then Begin > dy[p]:=cy[p1]; > Inc(p1); > If p2<=y Then > If cy[p2]<dy[p] Then Begin > dy[p]:=cy[p2]; > Inc(p2); > Dec(p1); > End; > End Else Begin > dy[p]:=cy[p2]; > Inc(p2); > End; > End; > For p:=x To y Do > cy[p]:=dy[p-x+1]; > End; > Begin > If x<y Then Begin > z:=(x + y) Div 2; > SortY(x,z); > SortY(z+1,y); > Merge; > End; > End; > Procedure SortX(x,y:Longint); > Var z:Longint; > Procedure Merge; > Var p,p1,p2:Longint; > Begin > p1:=x; p2:=z+1; p:=0; > While ((p1<=z) Or (p2<=y)) Do Begin > Inc(p); > If p1<=z Then Begin > dx[p]:=cx[p1]; > cp[p]:=co[p1]; > ad[p]:=ac[p1]; > Inc(p1); > If p2<=y Then > If cx[p2]<dx[p] Then Begin > dx[p]:=cx[p2]; > cp[p]:=co[p2]; > ad[p]:=ac[p2]; > Inc(p2); > Dec(p1); > End; > End Else Begin > dx[p]:=cx[p2]; > cp[p]:=co[p2]; > ad[p]:=ac[p2]; > Inc(p2); > End; > End; > For p:=x To y Do Begin > cx[p]:=dx[p-x+1]; > co[p]:=cp[p-x+1]; > ac[p]:=ad[p-x+1]; > End; > End; > Begin > If x<y Then Begin > z:=(x + y) Div 2; > SortX(x,z); > SortX(z+1,y); > Merge; > End; > End; > Procedure AddX(x,act,col:Longint); > Begin > If ((x>=0) And (x<=a)) Then Begin > Inc(nx); > cx[nx]:=x; > co[nx]:=col; > ac[nx]:=act; > End; > End; > Procedure SolveLine(y,k:Longint); > Var i:Longint; > Function First:Longint; > Var x,y,z:Longint; > Begin > x:=0; > y:=n; > Repeat > z:=(x+y) Div 2; > If pr[z]>0 Then > x Here's my new code: Program ShapingRegions; Const Max=1000;MaxB=10000; MaxC=2500; Type TRec=Record X1,Y1,X2,Y2,C,ID:Longint; End; Var a,b,n,i:Longint; r1,r,q:Array[0..Max] Of TRec; cy,cx,dy,dx:Array[1..3*Max] Of Longint; nx,ny:Longint; hy:Array[1..MaxB] Of Boolean; nc:Array[1..MaxC] Of Longint; lasty,lastx:Longint; pres:Array[0..Max] Of Longint; pr,pl:Array[0..Max+5] Of Longint; co,cp,ac,ad:Array[1..3*Max] Of Longint; hx:Array[0..3*Max] Of Boolean; Procedure ReadData; Var i:Longint; Begin Read(b,a,n); With r[0] Do Begin x1:=0; y1:=0; x2:=a; y2:=b; c:=1; id:=0; End; For i:=1 To n Do With r[i] Do Begin Read(y1,x1,y2,x2,c); id:=i; End; Move(r,r1,SizeOf(r1)); End; Procedure AddY(y:Longint); Begin If ((y>=1) And (y<=b)) Then If Not hy[y] Then Begin hy[y]:=True; Inc(ny); cy[ny]:=y; End; End; Procedure Sort(x,y:Longint); Var z:Longint; Procedure Merge; Var p,p1,p2:Longint; Begin p1:=x; p2:=z+1; p:=0; While ((p1<=z) Or (p2<=y)) Do Begin Inc(p); If p1<=z Then Begin q[p]:=r[p1]; Inc(p1); If p2<=y Then If r[p2].y1<q[p].y1 Then Begin q[p]:=r[p2]; Inc(p2); Dec(p1); End; End Else Begin q[p]:=r[p2]; Inc(p2); End; End; For p:=x To y Do r[p]:=q[p-x+1]; End; Begin If x<y Then Begin z:=(x + y) Div 2; Sort(x,z); Sort(z+1,y); Merge; End; End; Procedure SortBack(x,y:Longint); Var z:Longint; Procedure Merge; Var p,p1,p2:Longint; Begin p1:=x; p2:=z+1; p:=0; While ((p1<=z) Or (p2<=y)) Do Begin Inc(p); If p1<=z Then Begin q[p]:=r[p1]; Inc(p1); If p2<=y Then If r[p2].id<q[p].id Then Begin q[p]:=r[p2]; Inc(p2); Dec(p1); End; End Else Begin q[p]:=r[p2]; Inc(p2); End; End; For p:=x To y Do r[p]:=q[p-x+1]; End; Begin If x<y Then Begin z:=(x + y) Div 2; Sort(x,z); Sort(z+1,y); Merge; End; End; Procedure SortY(x,y:Longint); Var z:Longint; Procedure Merge; Var p,p1,p2:Longint; Begin p1:=x; p2:=z+1; p:=0; While ((p1<=z) Or (p2<=y)) Do Begin Inc(p); If p1<=z Then Begin dy[p]:=cy[p1]; Inc(p1); If p2<=y Then If cy[p2]<dy[p] Then Begin dy[p]:=cy[p2]; Inc(p2); Dec(p1); End; End Else Begin dy[p]:=cy[p2]; Inc(p2); End; End; For p:=x To y Do cy[p]:=dy[p-x+1]; End; Begin If x<y Then Begin z:=(x + y) Div 2; SortY(x,z); SortY(z+1,y); Merge; End; End; Procedure SortX(x,y:Longint); Var z:Longint; Procedure Merge; Var p,p1,p2:Longint; Begin p1:=x; p2:=z+1; p:=0; While ((p1<=z) Or (p2<=y)) Do Begin Inc(p); If p1<=z Then Begin dx[p]:=cx[p1]; cp[p]:=co[p1]; ad[p]:=ac[p1]; Inc(p1); If p2<=y Then If cx[p2]<dx[p] Then Begin dx[p]:=cx[p2]; cp[p]:=co[p2]; ad[p]:=ac[p2]; Inc(p2); Dec(p1); End; End Else Begin dx[p]:=cx[p2]; cp[p]:=co[p2]; ad[p]:=ac[p2]; Inc(p2); End; End; For p:=x To y Do Begin cx[p]:=dx[p-x+1]; co[p]:=cp[p-x+1]; ac[p]:=ad[p-x+1]; End; End; Begin If x<y Then Begin z:=(x + y) Div 2; SortX(x,z); SortX(z+1,y); Merge; End; End; Procedure AddX(x,act,col:Longint); Begin If ((x>=0) And (x<=a)) Then Begin Inc(nx); cx[nx]:=x; co[nx]:=col; ac[nx]:=act; End; End; Procedure SolveLine(y,k:Longint); Var i:Longint; Function F Here is my code i got AC in USACO but URAL Is anybody can tell me why? Program RECT1; const maxn=10000; type recttype=record lx,ly,rx,ry,c:integer; end; var save:array [1..maxn] of recttype; color:array [0..2500] of longint; k,mc:integer; Function check (rd,ru:recttype):boolean; begin if ((rd.lx>=ru.rx) or (rd.rx<=ru.lx) or (rd.ly>=ru.ry) or (rd.ry<=ru.ly)) then check:=false else check:=true; end; Procedure add (r:recttype;var u:integer; w:integer); begin if u=0 then begin save[w]:=r; u:=1; end else begin inc(k); save[k]:=r; end; end; Procedure cut (rd,ru:recttype;w:integer); var tem:recttype; u:integer; begin u:=0; if check (rd,ru) then if (ru.lx<=rd.lx) and (ru.ly<=rd.ly) and (ru.rx>=rd.rx) and (ru.ry>=rd.ry) then save[w].c:=0 else begin if rd.lx<ru.lx then begin tem:=rd; tem.rx:=ru.lx; add (tem,u,w); rd.lx:=ru.lx; end; if rd.rx>ru.rx then begin tem:=rd; tem.lx:=ru.rx; add (tem,u,w); rd.rx:=ru.rx; end; if rd.ry>ru.ry then begin tem:=rd; tem.ly:=ru.ry; add (tem,u,w); rd.ry:=ru.ry; end; if rd.ly<ru.ly then begin tem:=rd; tem.ry:=ru.ly; add (tem,u,w); rd.ly:=ru.ly; end; end; end; Procedure solve; var i,n,i1,t:integer; begin k:=1; save[1].c:=1; mc:=0; assign (input,'rect1.in'); reset (input); readln (save[1].rx,save[1].ry,n); for i:=1 to n do begin inc(k); t:=k; with save[k] do begin readln (lx,ly,rx,ry,c); if c>mc then mc:=c; end; for i1:=1 to k-1 do cut (save[i1],save[t],i1); end; close (input); end; Function area (a:recttype):longint; begin area:=abs((a.rx-a.lx)*(a.ly-a.ry)); end; Procedure print; var i:integer; begin fillchar (color,sizeof(color),0); for i:=1 to k do inc(color[save[i].c],area(save[i])); assign (output,'rect1.out'); rewrite (output); for i:=1 to mc do if color[i]>0 then writeln (i,' ',color[i]); close (output); end; begin solve; print; end. > > Here's my program: > > Program ShapingRegions; > > Const Max=1000;MaxB=10000; MaxC=2500; > > Type TRec=Record > > X1,Y1,X2,Y2,C:Longint; > > End; > > Var a,b,n,i:Longint; > > r:Array[0..Max] Of TRec; > > cy,cx,dy,dx:Array[1..3*Max] Of Longint; > > nx,ny:Longint; > > hy:Array[1..MaxB] Of Boolean; > > nc:Array[1..MaxC] Of Longint; > > lasty,lastx:Longint; > > pres:Array[0..Max] Of Longint; > > pr,pl:Array[0..Max+5] Of Longint; > > co,cp,ac,ad:Array[1..3*Max] Of Longint; > > hx:Array[0..3*Max] Of Boolean; > > Procedure ReadData; > > Var i:Longint; > > Begin > > Read(a,b,n); > > With r[0] Do Begin > > x1:=0; > > y1:=0; > > x2:=a; > > y2:=b; > > c:=1; > > End; > > For i:=1 To n Do > > With r[i] Do > > Read(x1,y1,x2,y2,c); > > End; > > Procedure AddY(y:Longint); > > Begin > > If ((y>=1) And (y<=b)) Then > > If Not hy[y] Then Begin > > hy[y]:=True; > > Inc(ny); > > cy[ny]:=y; > > End; > > End; > > Procedure SortY(x,y:Longint); > > Var z:Longint; > > Procedure Merge; > > Var p,p1,p2:Longint; > > Begin > > p1:=x; p2:=z+1; p:=0; > > While ((p1<=z) Or (p2<=y)) Do Begin > > Inc(p); > > If p1<=z Then Begin > > dy[p]:=cy[p1]; > > Inc(p1); > > If p2<=y Then > > If cy[p2]<dy[p] Then Begin > > dy[p]:=cy[p2]; > > Inc(p2); > > Dec(p1); > > End; > > End Else Begin > > dy[p]:=cy[p2]; > > Inc(p2); > > End; > > End; > > For p:=x To y Do > > cy[p]:=dy[p-x+1]; > > End; > > Begin > > If x<y Then Begin > > z:=(x + y) Div 2; > > SortY(x,z); > > SortY(z+1,y); > > Merge; > > End; > > End; > > Procedure SortX(x,y:Longint); > > Var z:Longint; > > Procedure Merge; > > Var p,p1,p2:Longint; > > Begin > > p1:=x; p2:=z+1; p:=0; > > While ((p1<=z) Or (p2<=y)) Do Begin > > Inc(p); > > If p1<=z Then Begin > > dx[p]:=cx[p1]; > > cp[p]:=co[p1]; > > ad[p]:=ac[p1]; > > Inc(p1); > > If p2<=y Then > > If cx[p2]<dx[p] Then Begin > > dx[p]:=cx[p2]; > > cp[p]:=co[p2]; > > ad[p]:=ac[p2]; > > Inc(p2); > > Dec(p1); > > End; > > End Else Begin > > dx[p]:=cx[p2]; > > cp[p]:=co[p2]; > > ad[p]:=ac[p2]; > > Inc(p2); > > End; > > | Help! | dimroed | 1147. Цветная бумага | 12 фев 2002 13:20 | 2 | Help! dimroed 7 фев 2002 06:37 I am trying to do the USACO training, which has the exact same problem. I have no idea how to proceed to solve it, and without solving it, I cannot advance in the training! Can anyone give me any hints on how to approach the problem? There are many method to solve this problem. I'm not introducing the best one. But you will be able to pass this problem at USACO with it for sure. At first , try to solve the problem 1019 : Line Painting or 105-Sky Line at Valladolid (acm.uva.es). You'll find something useful ;) | Help | Timus Observer | 1147. Цветная бумага | 21 дек 2001 20:08 | 1 | Help Timus Observer 21 дек 2001 20:08 I have solved this problem in USACO using Pascal, but here I got WA. Could someone advise what's the different ?. | It is problem from ioi. | Alec | 1147. Цветная бумага | 20 дек 2001 07:33 | 4 | Right, it is from IOI..... And, it has been to almost every competition I have heard about :) > Right, it is from IOI..... And, it has been to almost every > competition I have heard about :) |
|
|