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.
总的来说是挺简单的一道二分,却卡了很长时间。总是在各种细节上出错,顾此失彼。说明练习不足,码力不够,容易犯迷糊。
浙公网安备 33010602011771号