HOJ 2278 IP Filtering (二分)

HOJ 2278

主要思路:将IP地址看成4位256进制的数,转化成十进制,一个segment就是一个区间。

先将所有的segment按左端点升序排列,如果几个segment有重叠,则将它们合并成一个区间。

int dn=0;

   l=seg[0].start;

   r=seg[0].end;

   for(int j=1;j<i;j++)

   {

       if(seg[j].start<=r)

       {

           r=max(seg[j].end,r);

           continue;

       }

       seg[dn].start=l;

       seg[dn].end=r;

       dn++;

       l=seg[j].start;

       r=seg[j].end;

   }

   seg[dn].start=l;

   seg[dn].end=r;

   dn++;


 

这样结束之后,可以获得几个没有公共区域的区间。

接下来可以对segment的下标进行二分了。

如果seg[i].start>target,说明target落在了有效区间的左边,此时应该取二分的上半区域,即low=mid+1

同理,如果seg[i].end<target,此时应该high=mid-1;

     

   low=0;

       high=dn-1;

       while (low <= high)

       {

           mid = (high + low) / 2;

           if(temp>=seg[mid].start&&temp<=seg[mid].end)

          {

               flag=1;

               break;

           }

           if (seg[mid].start>temp)

           {

               high = mid-1 ;

           }



           else if(seg[mid].end<temp)

           {

               low = mid + 1;

           }

       }

 

这样最终如果能找到一个区间seg[mid],使target在这个区间内,输出yes,若low>high之后仍然没有找到这样的区间,说明target不在任何一个区间内,输出no.

总的来说是挺简单的一道二分,却卡了很长时间。总是在各种细节上出错,顾此失彼。说明练习不足,码力不够,容易犯迷糊。

posted on 2012-08-24 16:06  MicZ  阅读(162)  评论(0)    收藏  举报