首页 > 代码库 > XidianOJ 1023 IP查询

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查询