/ Vijos / 讨论 / 区间 /

求大神指点。。超时←。←

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 条评论

  • @ 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

信息

ID
1532
难度
7
分类
图结构 | 差分约束贪心 点击显示
标签
(无)
递交数
1744
已通过
290
通过率
17%
被复制
3
上传者