现在的位置: 首页 > 综合 > 正文

hdu 4941 Magical Forest 2014 Multi-University Training Contest 7

2018年01月14日 ⁄ 综合 ⁄ 共 1211字 ⁄ 字号 评论关闭

果真产生一种是个题就不会做的自我嫌弃的心理是不好的。。

这一题看着很吓人,其实就是一种映射+指针的想法。

因为M,N很大,无法直接存,但是K只有1e5,所以可以只存fruit以及其相对应的行和列。

感觉离散化的意思就是把行和列从0开始按序重新编号。

交换操作就是将原先的行/列对应的离散化后的行/列换一下,改变的是映射关系,注意这里面行操作和列操作是不会相互影响的。

例如原先是r->rx,交换了以后变成r->rx',所以对r的询问就变成了对离散化后的rx'的询问。

原始矩阵和离散化后的矩阵的行和列实际上都没有交换,改变的实际上是映射关系。

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include <ctype.h>
#include<map>
#include<time.h>
using namespace std;
//hdu 4941
//映射 指针
int W;
int N;
int M;
int K;
int Q;
int T;
map<int,int>mr;
map<int,int>mc;
map<pair<int,int>,int > mp;
int main()
{
    freopen("input.txt","r",stdin);
   //  freopen("data.txt","r",stdin);
    // freopen("out1.txt","w",stdout);
    scanf("%d",&W);
    mr.clear();
    mc.clear();
    mp.clear();
    for(int ca=1;ca<=W;ca++)
    {
        printf("Case #%d:\n",ca);
        scanf("%d %d %d",&N,&M,&K);
        int rr=0;
        int cc=0;
        for(int i=0;i<K;i++)
        {
            int x,y,c=0;
            scanf("%d %d %d",&x,&y,&c);
            if(mr[x]==0)
            {
                mr[x]=rr++;
            }
            if(mc[y]==0)
            {
                mc[y]=cc++;
            }
            mp[make_pair(mr[x],mc[y])]=c;
        }
        scanf("%d",&T);
        int a,b=0;
        while(T--)
        {
            scanf("%d %d %d",&Q,&a,&b);
            if(Q==1)
            {
                int tmp=mr[a];
                mr[a]=mr[b];
                mr[b]=tmp;
            }
            else if(Q==2)
            {
                int tmp=mc[a];
                mc[a]=mc[b];
                mc[b]=tmp;
            }
            else if(Q==3)
            {
                printf("%d\n",mp[make_pair(mr[a],mc[b])]);
            }

        }

    }
    return 0;
}



抱歉!评论已关闭.