[hoj 2278]IP Filtering[二分+区间合并]
来源:互联网 发布:cad软件官网 编辑:程序博客网 时间:2024/06/09 14:37
题意:
给出一些IP段,再给出一些IP,问这些IP是否在这些IP段中.
注意给出的段有可能左>右.要倒一下.
思路:
二分是已知值,找下标.在本题中是已知IP,找此IP应属于的段的下标.找到应属于的段的时候,判断是否在此段中即可.
/** 几个错误:IP左边为高位,右边为低位,这个不能任意改. 要用uint.修改要彻底. 区间合并的时候不仅考虑嵌套,还有重叠,相邻.**/#include <cstdio>#include <algorithm>using namespace std;typedef unsigned int uint;const int MAX = 1000005;const uint INF = ~0u;int cnt,n;typedef struct Seg{ uint l,r;}Seg;bool cmp(Seg a, Seg b){ return (a.l==b.l)?(a.r<b.r):(a.l<b.l);}Seg sg[MAX];void MergeSeg(){ n = cnt; uint rmax = sg[0].r,il = 0; for(int i=1;i<cnt;i++) { while(sg[i].l<=rmax+1 && i<cnt) { if(sg[i].r>rmax) rmax = sg[i].r; sg[i].l = sg[i].r = INF; i++; n--; } if(sg[i].l>rmax) { sg[il].r = rmax; il = i; rmax = sg[i].r; } } sort(sg,sg+cnt,cmp);}bool bin(uint x){ int ans = -1,l = 0, r = n-1, mid; while(l<=r) { mid = (l+r)>>1; if(sg[mid].l > x) r = mid - 1; else if(sg[mid].l < x) { ans = mid; l = mid + 1; } else { ans = mid; break; } } if(ans!=-1) { if(sg[ans].r>=x) return true; } return false;}int main(){ uint a,b,c,d,x,y,z,w,i=0; while(scanf("%u.%u.%u.%u %u.%u.%u.%u",&a,&b,&c,&d,&x,&y,&z,&w)==8) { uint p = a*(1<<24) + b*(1<<16) + c*(1<<8) + d; uint q = x*(1<<24) + y*(1<<16) + z*(1<<8) + w; if(p<=q) { sg[i].l = p; sg[i++].r = q; } else { sg[i].l = q; sg[i++].r = p; } } cnt = i; sort(sg,sg+cnt,cmp); MergeSeg(); getchar(); while(scanf("%u.%u.%u.%u",&a,&b,&c,&d)==4) { uint tIP = a*(1<<24) + b*(1<<16) + c*(1<<8) + d; if(bin(tIP)) puts("yes"); else puts("no"); }}
- [hoj 2278]IP Filtering[二分+区间合并]
- HOJ 2278 IP Filtering (二分)
- Hoj 2278 IP Filtering
- IP Filtering hoj 二分好题!!
- SOJ-2500(IP过滤,对区间排序,合并区间,然后对区间二分查找)
- hoj 2651 Pie(二分)hoj 2278 (二分)
- hdu2871(线段树区间合并+vector+二分)
- HDU 2871 Memory Control(线段树区间合并+二分)
- HDU-2871:Memory Control(区间合并+vector二分)
- HOJ 2608 Assemble(二分)
- HOJ 3034 Mysterious (二分)
- [hoj]Pie【二分】
- 区间合并
- 合并区间
- 合并区间
- 合并区间
- 合并区间
- 合并区间
- 常用到的一些判断是否为iphond 或ipad的方法
- HINSTANCE HANDLE HWND 的区别及一般方法
- 使用POI将数据导出到Excel文件
- VS项目属性设置
- strcpy和strncpy用法和区别
- [hoj 2278]IP Filtering[二分+区间合并]
- POJ 1125 Stockbroker Grapevine
- 讨人喜欢的 MySQL replace into 用法(insert into 的增强版)
- db2 online backup 设置
- myeclipse中导入eclipsecolorthemes的主题html文件中script块背景的问题
- VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果
- 关于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT、L
- 安装使用lvs
- 详细分析Java中断机制