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 |
注意事项以及一些想法。1、不止ans,tree的左右区间也要开到int64,数据坑爹。 2、因为40000条线,所以是80000的点,所以树应该开到400000左右。 discuss里有一些关于什么区间半开半闭什么的东西,我AC了以后也没弄懂是什么意思。本人理解能力不够的缘故吧。 不过本题中确实会用到spread函数(懒操作)。而且每个点x应该代表的是线段[x,x+1),这可能就是所谓的半开半闭区间吧。 具体处理方法就是,其他的都不变,在每次change的时候将区间[st,ed]的ed减1。 然后最后算总面积的时候(axis[tree[w].r+1]-axis[tree[w].l])*tree[w].h就可以了。 另,usaco 2007 open的数据网上可以搜到的... 附pascal代码一份 type node=record l,r,h,cover:int64; end; var n,i,j,k,st,ed,h:longint; ans:int64; high,verl,verr:array[0..40001]of longint; axis:array[0..90000]of longint; tree:array[0..400000]of node; procedure init; begin readln(n); for i:=1 to n do begin readln(verl[i],verr[i],high[i]); axis[i]:=verl[i]; axis[i+n]:=verr[i]; end; end; procedure sort(l,r:longint); var i,j,x,y:longint; begin i:=l;j:=r; x:=high[(l+r)shr 1]; repeat while high[i]<x do inc(i); while high[j]>x do dec(j); if not (i>j) then begin y:=high[i];high[i]:=high[j];high[j]:=y; y:=verl[i];verl[i]:=verl[j];verl[j]:=y; y:=verr[i];verr[i]:=verr[j];verr[j]:=y; inc(i);dec(j); end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; procedure sortaxis(l,r:longint); var i,j,x,y:longint; begin i:=l;j:=r; x:=axis[(l+r)shr 1]; repeat while axis[i]<x do inc(i); while axis[j]>x do dec(j); if not (i>j) then begin y:=axis[i];axis[i]:=axis[j];axis[j]:=y; inc(i);dec(j); end; until i>j; if l<j then sortaxis(l,j); if i<r then sortaxis(i,r); end; function map(x:longint):longint; var mid,l,r:longint; begin l:=1;r:=2*n; while l<=r do begin mid:=(l+r)shr 1; if axis[mid]=x then exit(mid); if x>axis[mid] then l:=mid+1 else r:=mid; end; end; procedure build(w,l,r:longint); var mid:longint; begin tree[w].l:=l;tree[w].r:=r; if l>=r then exit; mid:=(l+r)shr 1; build(2*w,l,mid); build(2*w+1,mid+1,r); end; procedure spread(w:longint); begin tree[w].cover:=0; tree[2*w].h:=tree[w].h; tree[2*w+1].h:=tree[w].h; tree[2*w].cover:=1; tree[2*w+1].cover:=1; end; procedure change(w:longint); var mid:longint; begin if (st<=tree[w].l)and(tree[w].r<=ed) then begin tree[w].h:=high[i]; tree[w].cover:=1; exit; end; if tree[w].cover=1 then spread(w); mid:=(tree[w].l+tree[w].r)shr 1; if st<=mid then change(2*w); if mid<ed then change(2*w+1); end; procedure sum(w:longint); begin if (tree[w].l=0)or(tree[w].l>tree[w].r) then exit; if tree[w].cover=1 then begin ans:=ans+(axis[tree[w].r+1]-axis[tree[w].l])*tree[w].h; exit; end; sum(2*w); sum(2*w+1); end; begin //assign(input,'1.txt'); //assign(output,'2.txt'); //reset(input);rewrite(output); init; sort(1,n); sortaxis(1,2*n); build(1,1,2*n); for i:=1 to n do begin st:=map(verl[i]); ed:=map(verr[i])-1; change(1); end; sum(1); writeln(ans); //close(input);close(output); end. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator