覆盖统计(axis.c/cpp/pas)
【题目大意】
数轴上有一些点,从 1 标记到n,逐渐被线段覆盖, 求
每次覆盖后未被覆盖的点的个数。
【输入数据】
第一行,点数 n,操作数k。
接下来k 行,每行是线段的左右端点 l,r
【输出数据】
k行,每次操作后未被覆盖的点。
【输入样例】
9 3
3 3
5 7
1 9
【输出样例】
8
5
0
【数据范围】
对于 30%的数据,1<=n,k<=2000;
对于 100%的数据,1<=n<=200000,k<=600000
----------------------------------------
树什么的不熟练啊,就想出了一种神奇的方法,覆盖的地方false掉,用一个next函数跳转,原来覆盖过的地方就不扫了,这样可以省去很多时间。最后偶尔更新一下,使next函数简化,数据全过啦!!!(结果后来发现更新反而更花时间,不更新能够更快AC。。。。)
var b:array[0..200001]of boolean; back,next:array[0..200001]of longint; i,j,n,k,l,r,ans,last:longint; begin assign(input,‘axis.in‘); assign(output,‘axis.out‘); reset(input); rewrite(output); read(n,k); fillchar(b,sizeof(b),true); ans:=n; for i:=1 to n do next[i]:=i+1; for j:=1 to k do begin read(l,r); i:=l; repeat begin if b[i] then begin i:=i+1; next[i-1]:=r+1; b[i-1]:=not b[i-1]; dec(ans); end else i:=next[i]; end; until (i>r)or(i>n); writeln(ans); if j mod 10000=0 then //更新next函数 begin last:=n+1; for i:=n downto 1 do begin if (b[i]=false)and(b[i-1]=true) then next[i]:=last; if (b[i]=true)and(b[i-1]=false) then last:=i; end; end; end; close(input); close(output); end.
原文地址:http://www.cnblogs.com/zjhl2/p/3855967.html