HDU 4941 Magical Forest 【离散化】【map】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941

题目大意:给你10^5个点,每个点有一个数值,点的xy坐标是0~10^9,点存在于矩阵中。然后给出10^5个操作,1代表交换行,2代表交换列,3代表查询坐标为xy点的数值。

数据量很大........ 所以一直没有思路

后来赛后看了题解是先用离散化然后存在线性map里面。

用hx,hy来存放离散化后的点的坐标,用linkx,linky来存放点离散化之后的点的坐标的行与列。

还是对于STL里面的基础运用掌握不牢。

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<map>
using namespace std;
#define maxn 100010

struct node {
     int u,v,w;
} point[maxn];

//其主要的原理是用一个线性的map存放,
//map里面的<int,int>是map一个特征,最后其所占的空间还是maxn这么多
map<int,int> p_w[maxn];
map<int,int> hx,hy;

bool  cmpx(node A,node B)
{
     return A.u<B.u;
}


bool cmpy(node A,node B)
{
     return A.v<B.v;
}

int main ()
{
     int W;
     scanf("%d",&W);
     for(int w=1; w<=W; w++) {
          ///初始化
          for(int i=0; i<maxn; i++) p_w[i].clear();
          hx.clear();
          hy.clear();

          int N,M,K;
          scanf("%d%d%d",&N,&M,&K);
          for(int i=0; i<K; i++)
               scanf("%d%d%d",&point[i].u,&point[i].v,&point[i].w);

          int tx=1;
          sort(point,point+K,cmpx);
          for(int i=0; i<K; i++) if(!hx[point[i].u]) hx[point[i].u]=tx++;

          int ty=1;
          sort(point,point+K,cmpy);
          for(int i=0; i<K; i++) {
               if(!hy[point[i].v]) hy[point[i].v]=ty++;
               p_w[hx[point[i].u]][hy[point[i].v]]=point[i].w;
          }

          int linkx[maxn];
          int linky[maxn];
          for(int i=0; i<maxn; i++) linkx[i]=i,linky[i]=i;

          printf("Case #%d:\n",w);

          int T;
          int Q,A,B;
          scanf("%d",&T);
          while(T--) {
               scanf("%d%d%d",&Q,&A,&B);

               if(Q==1) {
                    int tem=linkx[hx[A]];
                    linkx[hx[A]]=linkx[hx[B]];
                    linkx[hx[B]]=tem;
               }
               if(Q==2) {
                    int tem=linky[hy[A]];
                    linky[hy[A]]=linky[hy[B]];
                    linky[hy[B]]=tem;
               }
               if(Q==3)
                    printf("%d\n",p_w[linkx[hx[A]]][linky[hy[B]]]);
          }
     }
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值