前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1637: [Usaco2007 Mar]Balanced Lineup

1637: [Usaco2007 Mar]Balanced Lineup

作者头像
HansBug
发布2018-04-10 16:15:14
6290
发布2018-04-10 16:15:14
举报
文章被收录于专栏:HansBug's Lab

1637: [Usaco2007 Mar]Balanced Lineup

Time Limit: 5 Sec  Memory Limit: 64 MB

Submit: 393  Solved: 263

[Submit][Status]

Description

Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的坐标(范围: 0..1,000,000,000)和种族(0或1)。 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相也不例外。他只给一部分牛照相,并且这一组牛的阵容必须是“平衡的”。平衡的阵容,指的是在一组牛中,种族0和种族1的牛的数量相等。 请算出最广阔的区间,使这个区间内的牛阵容平衡。区间的大小为区间内最右边的牛的坐标减去最做边的牛的坐标。 输入中,每个种族至少有一头牛,没有两头牛的坐标相同。

Input

行 1: 一个整数: N 行 2..N + 1: 每行两个整数,为种族 ID 和 x 坐标。

Output

行 1: 一个整数,阵容平衡的最大的区间的大小。

Sample Input

7 0 11 1 10 1 25 1 12 1 4 0 13 1 22

Sample Output

11 输入说明 有7头牛,像这样在数轴上。 1 1 0 1 0 1 1 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 输出说明 牛 #1 (at 11), #4 (at 12), #6 (at 13), #7 (at 22) 组成一个平衡的最大的区间,大小为 22-11=11 个单位长度。 <-------- 平衡的 --------> 1 1 0 1 0 1 1 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

HINT

Source

Silver

 题解:这个嘛,虽然一次性AC了,但是还是有好多的波折——一开始想了半天才有了思路,然后写写写写写,然后中途硬是被打断干别的,然后回来啥都忘了,然后重新瞎折腾代码越改越乱心里越来越烦,然后最后看样子似乎有模有样了,然后Accept,然后没有然后了(想到兴头上被打断思路简直要命啊有木有)。。。好了,说思路——先按照各个牛的位置排个序,然后假如种族为0记-1,1记1,则问题转化为了求最长的和为0的区间,接下来就好办了——记录下同一前缀和的最早出现时间和最晚出现时间,然后找最大时间差即可。。。

代码语言:javascript
复制
var
   i,j,k,l,m,n:longint;
   a,b,c,f:array[0..100000] of longint;
   d,e:array[-60000..60000] of longint;
procedure swap(var x,y:longint);
          var z:longint;
          begin
               z:=x;x:=y;y:=z;
          end;
procedure sort(l,r:longint);
          var i,j,x,y:longint;
          begin
               i:=l;j:=r;
               x:=a[(l+r) div 2];
               repeat
                     while a[i]<x do inc(i);
                     while a[j]>x do dec(j);
                     if i<=j then
                        begin
                             swap(a[i],a[j]);
                             swap(b[i],b[j]);
                             inc(i);dec(j);
                        end;
               until i>j;
               if l<j then sort(l,j);
               if i<r then sort(i,r);
          end;
begin
     readln(n);
     for i:=1 to n do
         begin
              readln(b[i],a[i]);
              if b[i]=0 then b[i]:=-1;
         end;
     sort(1,n);
     c[0]:=0;
     for i:=1 to n do
         c[i]:=c[i-1]+b[i];
     fillchar(d,sizeof(d),-1);
     fillchar(e,sizeof(e),-1);
     for i:=0 to n do
         begin
              if (d[c[i]]=-1) then d[c[i]]:=i;
              e[c[i]]:=i;
         end;
     l:=0;
     for i:=-50000 to 50000 do
         begin
              if e[i]<=d[i] then continue;
              if (a[e[i]]-a[d[i]+1])>l then l:=a[e[i]]-a[d[i]+1];
         end;
     writeln(l);
end.
                          
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-12-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1637: [Usaco2007 Mar]Balanced Lineup
  • Description
  • Input
  • Output
  • Sample Input
  • Sample Output
  • HINT
  • Source
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档