Codeforces Round #376 (Div. 2) D. 80-th Level Archeology

原题网址:http://codeforces.com/contest/731/problem/D
这里写图片描述
这里写图片描述
对于相邻的两行,我们可以求出合法的答案区间,然后对所有的区间取一下区间并。因为只有最后一次询问,所以对于区间并,可以用差分维护,那么区间并的总复杂度只要O(C)了。

var
  a:array[0..1,0..1000050] of longint;
  cf:array[-1..1000050] of int64;
  n,c,last,now,cnt,tot,i:longint;
function max(a,b:longint):longint;
  begin if (a>b) then exit(a) else exit(b); end;
function min(a,b:longint):longint;
  begin if (a<b) then exit(a) else exit(b); end;
procedure print(x:longint);
  begin
    writeln(x);
    halt;
  end;
begin
  read(n,c);
  last:=0;now:=1;cnt:=1;
  read(a[now][0]);
  for i:=1 to a[now][0] do
    read(a[now][i]);
  while (cnt<n) do
    begin
      last:=last xor 1;
      now:=now xor 1;
      inc(cnt);
      read(a[now][0]);
      for i:=1 to a[now][0] do
        read(a[now][i]);
      for i:=1 to max(a[last][0],a[now][0]) do
        if (i>min(a[last][0],a[now][0]))
          then
            begin
              if (a[last][0]>a[now][0])
                then print(-1);
            end
          else
            begin
              if (a[last][i]=a[now][i]) then continue;
              inc(tot);
              if (a[last][i]<a[now][i])
                then
                  begin
                    inc(cf[0]);
                    dec(cf[c-a[now][i]+1]);
                    inc(cf[c-a[last][i]+1]);
                    dec(cf[c]);
                  end
                else
                  begin
                    inc(cf[c-a[last][i]+1]);
                    dec(cf[c-a[now][i]+1]);
                  end;
              break;
            end;
    end;
  for i:=0 to c do cf[i]:=cf[i-1]+cf[i];
  for i:=0 to c do if (cf[i]=tot) then print(i);
  print(-1);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值