zoukankan      html  css  js  c++  java
  • hdu 4022 Bombing

    题目大意:在二维平面上,给一些点。有两个操作:给一个d,把所有x为d的点去掉,或把所有y为d的点去掉,问每次去掉的点。

    我的思路:

    先将横纵坐标都离散化(大部分时间都花在这个上面吧),然后直接把出现过的点(离散过的点)累计,每次询问之后就可以直接输出了,之后再维护一下,把对应的x或y的累计值 减1

    ==! 很浅显的思路

    我的代码:600+ms

    View Code
    #include<iostream>
    #include
    <map>
    using namespace std;
    map
    <int,int> mapx;
    map
    <int,int> mapy;
    map
    <int,int>::iterator it1,it2;
    int ex[200001];
    struct ni
    {
    int v;
    ni
    *next;
    };
    struct node
    {
    int v;
    ni
    *next;//用链表保存对应的x值或y值
    }p[200001];//直接对x和y离散化,所以总数有200000个
    int main()
    {
    int n,m,k,a,b,x,y;
    while(scanf("%d %d",&n,&m)==2&&(m||n))
    {
    mapx.clear();
    mapy.clear();
    int num=0;
    it1
    =mapx.end();
    it2
    =mapy.end();
    memset(ex,
    0,sizeof(ex));
    for(int i=0;i<n;i++)
    {
    scanf(
    "%d %d",&x,&y);
    if(it1==mapx.find(x))
    {
    a
    =num++;
    mapx[x]
    =a;
    p[a].next
    =NULL;
    }
    else a=mapx[x];
    if(it2==mapy.find(y))
    {
    b
    =num++;
    mapy[y]
    =b;
    p[b].next
    =NULL;
    }
    else b=mapy[y];
    ni
    *q=p[a].next,*temp=p[a].next;
    while(q!=NULL)
    {
    temp
    =q;
    q
    =q->next;
    }
    ni
    *newn=(ni *)malloc(sizeof(ni));
    newn
    ->v=b;//将x对应的y值插入对应的链表中
    newn->next=NULL;
    if(p[a].next==NULL)p[a].next=newn;
    else temp->next=newn;
    temp
    =q=p[b].next;
    while(q!=NULL)
    {
    temp
    =q;
    q
    =q->next;
    }
    newn
    =(ni*)malloc(sizeof(ni));
    newn
    ->v=a;//将y对应的x值插入对应的链表中
    newn->next=NULL;
    if(p[b].next==NULL) p[b].next=newn;
    else
    temp
    ->next=newn;
    ex[a]
    ++;
    ex[b]
    ++;
    }
    while(m--)
    {
    scanf(
    "%d %d",&k,&a);
    if(k==0)
    {
    if(it1==mapx.find(a))
    {
    printf(
    "0\n");continue;
    }
    x
    =mapx[a];
    if(ex[x]>0)
    printf(
    "%d\n",ex[x]);
    else printf("0\n");
    mapx.erase(a);
    ex[x]
    =0;
    ni
    *q=p[x].next;
    while(q!=NULL)
    {
    ex[q
    ->v]--;
    q
    =q->next;
    }
    }
    else if(k)
    {
    if(it2==mapy.find(a))
    {
    printf(
    "0\n");continue;
    }
    y
    =mapy[a];
    if(ex[y]>0)
    printf(
    "%d\n",ex[y]);
    else printf("0\n");
    mapy.erase(a);
    ex[y]
    =0;
    ni
    *q=p[y].next;
    while(q!=NULL)//维护操作
    {
    ex[q
    ->v]--;
    q
    =q->next;
    }
    }
    }
    printf(
    "\n");
    }
    return 0;
    }

    其他的思路:快排+二分查找。300+ms

    首先,每一个点都给一个唯一的编号,分两部分排序,对x和对y。然后暴力去点。

    其实,这个我也想过,可是当时很执着的以为,每次询问都要排序,我的天呐,当时短路了

    View Code
    #include<stdio.h>
    #include
    <string.h>
    #include
    <stdlib.h>
    struct nd{
    int x,y,s;
    }ax[
    100005],ay[100005];
    int vis[100005];
    int cmpx(const void *a,const void *b){
    struct nd *aa=(struct nd*)a;
    struct nd *bb=(struct nd*)b;
    return aa->x-bb->x;
    }
    int cmpy(const void *a,const void *b){
    struct nd *aa=(struct nd*)a;
    struct nd *bb=(struct nd*)b;
    return aa->y-bb->y;
    }
    int bsx(int n,int val){
    int l=1,h=n,m;
    while( l<h ){
    m
    =(l+h)/2;
    if( ax[m].x>=val ) h=m;
    else l=m+1;
    }
    return l;
    }
    int bsy(int n,int val){
    int l=1,h=n,m;
    while( l<h ){
    m
    =(l+h)/2;
    if( ay[m].y>=val ) h=m;
    else l=m+1;
    }
    return l;
    }
    int main()
    {
    int i,j,t,k,x,y,n,m;
    while( scanf("%d %d",&n,&m)==2 ){
    if( m+n==0 ) break;
    for( i=1; i<=n; i++ ){
    scanf(
    "%d%d",&x,&y);
    ax[i].x
    =x; ax[i].y=y; ax[i].s=i;
    ay[i].x
    =x; ay[i].y=y; ay[i].s=i;
    vis[i]
    =0;
    }
    qsort(ax
    +1,n,sizeof(ax[0]),cmpx);
    qsort(ay
    +1,n,sizeof(ay[0]),cmpy);
    while( m-- ){
    int ans=0;
    scanf(
    "%d%d",&t,&k);
    if( t==0 ){
    j
    =bsx(n,k);
    for( i=j; i<=n; i++ ){
    if( (ax[i].x==k) && !vis[ax[i].s] ) ans++;
    else if( ax[i].x!=k ) break; //这里是重点,原来写的是ax[i].x!=ax[j].x
    vis[ax[i].s]=1;
    }
    }
    else{
    j
    =bsy(n,k);
    for( i=j; i<=n; i++ ){
    if( (ay[i].y==k) && !vis[ay[i].s] ) ans++;
    else if( ay[i].y!=k ) break;
    vis[ay[i].s]
    =1;
    }
    }
    printf(
    "%d\n",ans);
    }
    puts(
    "");
    }
    return 0;
    }
  • 相关阅读:
    Servlet Filter
    Analysis of Web.xml in Hello1 project
    Introduction of Annotation
    Analysis of container and Injection in Java, their history and future.
    Maven + Glassfish 实现hello
    java Building tool
    HTTP RFC(自学心得)
    URI和URL
    Git 版本控制
    Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)
  • 原文地址:https://www.cnblogs.com/nanke/p/2173475.html
Copyright © 2011-2022 走看看