XidianOJ 1023 IP查询
Posted TOTOTOTOTZZZZZ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XidianOJ 1023 IP查询相关的知识,希望对你有一定的参考价值。
题目描述
现实生活中,每一个IP段都指向一座城市。为了简化问题,我们将IP段直接看做一个整形数,每座城市也有自己的唯一标识ID,也可以看做一个整数。那么问题来了,现在已知有多个闭区间代表多个IP段,每个区间对应一个城市的ID。现在,小L要查询某个IP属于那个城市,希望聪明的你来帮他完成。
输入
第一行输入T,表示有T组测试数据(T<=5)
接下来一行输入整数n,代表有n个区间(0=<n<=10^5)
接下来n行,每行输入三个整数x,y,id.代表区间[x,y]所对应的城市ID。数据确保任意俩个区间交集为空,且ID唯一。(0=<x<y<=10^8 , 0=<ID<=10^8)
接下来一行输入整数m,代表m次查询(0=<m<=10^5)
接下来m行,每行输入一个整数V,代表所查询的IP(V<=10^8)
输出
对于每次查询,输出一行,表示其对应的城市ID。
如果未找到,输出-1
--正文
感觉c++还是好使啊,有时候是真的不想写一遍排序
#include<cstdio> #include<algorithm> using namespace std; int n; typedef struct Node { int l,r,id; }Node; Node p[100007]; int cmp(const Node a,const Node b) { return a.l<b.l; } int search(int q) { if(q<p[0].l) return -1; int left=0,right=n-1; while(right>left) { int mid=(left+right+1)/2; if(q>=p[mid].l) { left=mid; } else { right=mid-1; } } return left; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d%d",&p[i].l,&p[i].r,&p[i].id); } sort(p,p+n,cmp); int l; scanf("%d",&l); int q; for(int i=0;i<l;i++) { scanf("%d",&q); int t=search(q); if(t==-1) puts("-1"); else if(p[t].r>=q) printf("%d\n",p[t].id); else puts("-1"); } } return 0; }
以上是关于XidianOJ 1023 IP查询的主要内容,如果未能解决你的问题,请参考以下文章