- 区间
- 2015-08-15 15:54:55 @
var
n,i,j,x,s:longint;
a,b,c:array[1..50000] of longint;
f:array[1..50000] of boolean;
procedure kp(l,r:longint);
var
i,j,t,mid:longint;
begin
i:=l;j:=r;
mid:=b[(l+r) div 2];
repeat
while b[i]<mid do inc(i);
while b[j]>mid do dec(j);
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
t:=b[i];b[i]:=b[j];b[j]:=t;
t:=c[i];c[i]:=c[j];c[j]:=t;
inc(i);dec(j);
end;
until i>j;
if l<j then kp(l,j);
if i<r then kp(i,r);
end;
begin
readln(n);
for i:=1 to n do
readln(a[i],b[i],c[i]);
kp(1,n);
for i:=1 to n do
begin
x:=0;
for j:=a[i] to b[i] do
if f[j] then
inc(x);
for j:=b[i] downto a[i] do
if x>=c[i] then
break
else if not(f[j]) then
begin
inc(x);
f[j]:=true;
inc(s);
end;
end;
if s=0 then
writeln(-1)
else writeln(s);
end.
蒟蒻我只想到这种方法了。。。%>_<%
1 条评论
-
t14t41t LV 10 @ 2015-08-15 17:13:29
这样的O(n^2)算法一定会超时的。
这个题像是个差分约束系统。
令f[i]表示闭区间[1,i]所有的元素个数,那么对每一个三元组[a,b,c],都可以抽象成f[b]-f[a-1]>=c;
对于每一个不等式,从点a-1向点b连一条有向边,边权为c;
同时,有0<=f[i]-f[i-1]<=1,f[0]=0,所以枚举i,从点i-1向点i连一条权值为0的有向边,从i向i-1连一条权值为-1的有向边;
从0跑一遍最长路,得到的dist数组即为最小值;如果存在正环说明无解;
- 1