hdu4022 离散化

来源:互联网 发布:阿里云 禁止ip访问 编辑:程序博客网 时间:2024/06/06 09:34

去年上海赛区网络赛的一道水题。。。可还是刚开始被我搞的烂七八糟,无奈之下,看了别人的博客,才恍然大悟。。的确,在这种题面前真心弱爆了。。。。这道题一看就是要离散化,然后紧跟着就是排序,分别对x,y排序。我之所以搞乱了,就是在离散化的时候没有记录原值id。。。之所以要这个原值id,就是在要通过离散化的数据找到图上的点,从而完成标记和统计。。。。也就是离散后在归整,附代码:

#include <iostream>using namespace std;struct node{    int val;    int id;};const int N=101000;const int Max=0xfffffff;node x[N],y[N];int n,q[N];bool cmp(node a,node b){    return a.val<b.val;}int find(int d,node* c,int l,int r){    if (r-l<=1)    {        if (c[l].val==d) return l;        else if (c[r].val==d) return r;        else return -1;       }    else    {        int m=(l+r)>>1;        if (d<=c[m].val) return find(d,c,l,m);        else return find(d,c,m+1,r);     }}int deal(int d,node* c){    int j,num=0,k;    j=find(d,c,1,n);    if (j<0) return 0;    do    {        k=c[j].id;        if (!q[k])         {            q[k]=1;            num++;        }        if (c[j].val==c[j+1].val) j++;        else break;    }                while (true);    return num;}int main(){    int m,i,c,d,k;    while (scanf("%d%d",&n,&m)!=EOF)    {        if (n==0&&m==0) break;        memset(q,0,sizeof(q));        for (i=1;i<=n;i++)        {            scanf("%d%d",&x[i].val,&y[i].val);            x[i].id=y[i].id=i;        }        sort(x+1,x+n+1,cmp);        sort(y+1,y+n+1,cmp);        x[n+1].val=y[n+1].val=Max-1;        x[n+1].id=y[n+1].id=n+1;        for (i=1;i<=m;i++)        {            scanf("%d%d",&c,&d);            if (c==0)            {                printf("%d\n",deal(d,x));            }            else            {                printf("%d\n",deal(d,y));            }        }        printf("\n");    }    return 0;}