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