题目链接: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]]]);
          }
     }
}

HDU 4941 Magical Forest 【离散化】【map】的更多相关文章

  1. hdu 4941 Magical Forest (map容器)

    Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  2. HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第 ...

  3. hdu 4941 Magical Forest ( 双重map )

    题目链接 题意: 有一个n*m的田地,里边有k棵树,每棵树的位置为(xi,yi),含有能量值ci.之后又q个询问,分三种; 1)1 a b,将a行和b行交换 2)2 a b,将a列和b列交换 3)3 ...

  4. HDU 4941 Magical Forest --STL Map应用

    题意: 有n*m个格子(n,m <= 2*10^9),有k(k<=10^5)个格子中有值,现在有三种操作,第一种为交换两行,第二种为交换两列,交换时只有两行或两列都有格子有值或都没有格子有 ...

  5. hdu 4941 Magical Forest

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4941 Magical Forest Description There is a forest can ...

  6. STL : map函数的运用 --- hdu 4941 : Magical Forest

    Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  7. HDU 4941 Magical Forest (Hash)

    这个题比赛的时候是乱搞的,比赛结束之后学长说是映射+hash才恍然大悟.因此决定好好学一下hash. 题意: M*N的格子,里面有一些格子里面有一个值. 有三种操作: 1.交换两行的值. 2.交换两列 ...

  8. HDU 4941 Magical Forest(2014 Multi-University Training Contest 7)

    思路:将行列离散化,那么就可以用vector 存下10W个点 ,对于交换操作 只需要将行列独立分开标记就行   . r[i] 表示第 i 行存的是 原先的哪行         c[j] 表示 第 j ...

  9. hdu4941 Magical Forest (stl map)

    2014多校7最水的题   Magical Forest Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit ...

随机推荐

  1. call Kernelized Correlation Filters Tracker(Matab) in Qt(c++)

    recently, i need call the KCF tracker in my graduation project. the KCF tracker is fast and best per ...

  2. 【调试】DLL EXE 调试技巧

    0.随便说点 最近因为一些原因一直都没有更新博客,从今天开始要逐渐恢复了,也是对自己的鞭策. 1.本文目标 本文要说在有DLL 和 EXE源码的情况下调试DLL 和 EXE, 工具是VC++2010, ...

  3. NewtonPrincipia --- 公理或运动的定律 --- 系理二

    NewtonPrincipia --- 公理或运动的定律 --- 系理二 自然哲学的数学原理>公理或运动的定律>系理II 平行四边形ABCD,那么:直接的力AD由任意的力AB和BD合成,直 ...

  4. PermGen space Eclipse 终极解决方案

    1.选中项目右键 run or debug configurations... 2.在 VM arguments 加入  -Xms128m -Xmx512m -XX:PermSize=64M -XX: ...

  5. SQL和NOSQL有区别吗?

    在大数据高速发展的今天,数据量在不断的增加,传统的数据库可能不能满足人们的需求了,这个时候新霸哥注意到了NOSQL出现了可以解决这个问题.我们知道sql数据库可以存储数据和处理数据,但是NOSQL最大 ...

  6. 凸包模板 POJ1873

    // 凸包模板 POJ1873 // n=15所以可以按位枚举求凸包,再记录数据 #include <iostream> #include <cstdio> #include ...

  7. Fedora20 和ubuntu 14.04 chrome标签中文乱码

    作为两个流行的桌面发行版本,Fedora和ubuntu最新版本都存在chrome标签中文乱码问题. 下面是解决办法,都来自百度贴吧. 1.ubuntu 系列: 解决办法就是: 编辑/etc/fonts ...

  8. java多线程之Lock线程同步

    1.线程同步: package cn.itcast.heima2; import java.util.concurrent.locks.Lock; import java.util.concurren ...

  9. ZOJ-3686 A Simple Tree Problem 线段树

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3686 题意:给定一颗有根树,每个节点有0和1两种值.有两种操作: ...

  10. C#获取文件的绝对路径

    要在c#中获取路径有好多方法,一般常用的有以下五种: //获取应用程序的当前工作目录. String path1 = System.IO.Directory.GetCurrentDirectory() ...