Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
表示POJ数据是错的 不处理特殊情况 内附反例数据和代码如果你AC了 这组数据必然过不了 1 3 1 10 1 3 6 10 正确是3 但是只当你算出来是2的时候你才能A 为什么呢 因为4-5这段区间离散化的时候并没有处理到 下面是最后的AC程序 加上大括号部分代码之后才是正确程序 == Code == program poj2528; var c:array[0..80000] of longint; v:array[0..30000] of longint; o:array[0..30000] of boolean ; a,b:array[1..10000] of longint; t,tt,n,i,x,cnt,ans:longint; procedure qsort(l,r:longint) ; var i,j,t,x:longint; begin i := l; j := r; x := v[(l+r) shr 1] ; repeat while v[i] < x do inc(i) ; while v[j] > x do dec(j) ; if i <= j then begin t := v[i] ; v[i] := v[j] ; v[j] := t ; inc(i) ; dec(j) ; end; until i > j ; if i < r then qsort(i,r) ; if l < j then qsort(l,j) ; end; procedure pushdown(x:longint); begin if c[x] <> 0 then begin c[x shl 1] := c[x] ; c[x shl 1+1] := c[x] ; c[x] := 0 ; end; end; procedure modify(ll,rr,u,l,r,x:longint) ; var m:longint; begin if (ll <= l) and (r <= rr) then begin c[x] := u ; exit ; end; pushdown(x) ; m := (l+r) shr 1; if ll <= m then modify(ll,rr,u,l,m,x shl 1) ; if m < rr then modify(ll,rr,u,m+1,r,x shl 1+1) ; end; function query(l,r,x:longint):longint; var m:longint; begin if l > r then exit; if c[x] <> 0 then begin if not o[c[x]] then begin o[c[x]] := true ; inc(ans) ; end ; exit; end; if l = r then exit ; m := (l+r) shr 1; query(l,m,x shl 1); query(m+1,r,x shl 1+1); end; function seek(x:longint):longint; var l,r,m:longint; begin l := 1; r := cnt ; while l <= r do begin m := (l+r) shr 1 ; if v[m] = x then exit(m) else if v[m] < x then l := m+1 else r := m-1 ; end ; exit(l) ; end; BEGIN read(t) ; for tt := 1 to t do begin fillchar(c,sizeof(c),0) ; read(n) ; fillchar(v,sizeof(v),0); cnt := 0 ; for i := 1 to n do begin read(a[i],b[i]) ; inc(cnt) ; v[cnt] := a[i] ; inc(cnt) ; v[cnt] := b[i] ; end; qsort(1,cnt) ; x := 0 ; for i := 1 to cnt do if v[i] <> v[i-1] then begin inc(x) ; v[x] := v[i] ; end; cnt := x ; { for i := 2 to cnt do if v[i]-v[i-1] > 1 then begin inc(x) ; v[x] := v[i-1]+1; end; cnt := x ; } qsort(1,cnt); for i := 1 to n do modify(seek(a[i]),seek(b[i]),i,1,cnt,1) ; fillchar(o,sizeof(o),false) ; ans := 0 ; query(1,cnt,1) ; writeln(ans) ; end; END. Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator