首页 > 其他 > 详细

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

时间:2014-08-13 14:48:56      阅读:337      评论:0      收藏:0      [点我收藏+]

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

解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第一种是行交换操作,就是把矩阵的两行进行交换,另一种是列交换操作,注意两种操作都要求行或列至少要有一个水果,第三种操作是查找,询问第A行B列的水果的能量值,如果查询的位置没有水果,则输出0.

因为n和m都很大,达到了2*10^9,但水果最多一共只有10^5个,我的做法是直接用结构体存了之后排序,然后map[i] = j,表示当前的i行相当于原地图中的j行,这样进行行交换操作的时候只要交换一下这个就可以了,原地图上的模样不变,列交换同理。

bubuko.com,布布扣
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<map>
 6 using namespace std;
 7 #define maxn 100005
 8 struct node
 9 {
10     int x,y,c;
11 }mat[maxn];
12 map<int,int> hang,lie;
13 bool cmp(node a,node b)
14 {
15     if(a.x == b.x) return a.y < b.y;
16     return a.x < b.x;
17 }
18 int query(int k,int x,int y)
19 {
20     int l = 1,r = k,d = x,m;
21     while(l < r)
22     {
23         m = (l + r) >> 1;
24         if(d <= mat[m].x) r = m;
25         else l = m + 1;
26     }
27     int s1 = l;
28     if(mat[s1].x != x) return 0;   //没找到一个符合的x,说明没有这一行 
29     l = 1,r = k,d = x + 1;
30     while(l < r)
31     {
32         m = (l + r) >> 1;
33         if(d <= mat[m].x) r = m;
34         else l = m + 1;
35     }
36     int s2 = l;
37     if(mat[s2].x != x) s2--;
38     l = s1,r = s2;
39     while(l < r)
40     {
41         m = (l + r) / 2;
42         if(y <= mat[m].y) r = m;
43         else l = m + 1;
44     }
45     if(mat[l].y != y) return 0;   //没找到符合的y,说明这一行的这一列没有 
46     return mat[l].c;
47 }
48 int main()
49 {
50     int T,n,m,k,q,kase = 1;
51     scanf("%d",&T);
52     while(T--)
53     {
54         scanf("%d%d%d",&n,&m,&k);
55         hang.clear();
56         lie.clear();
57         for(int i = 1;i <= k;++i)
58         {
59             scanf("%d%d%d",&mat[i].x,&mat[i].y,&mat[i].c);
60             hang[mat[i].x] = mat[i].x;
61             lie[mat[i].y] = mat[i].y;
62         }
63         sort(mat+1,mat+k+1,cmp);
64         printf("Case #%d:\n",kase++);
65         scanf("%d",&q);
66         int op,a,b;
67         while(q--)
68         {
69             scanf("%d%d%d",&op,&a,&b);
70             if(op == 1)
71             {
72                 swap(hang[a],hang[b]);
73             }
74             else if(op == 2)
75             {
76                 swap(lie[a],lie[b]);
77             }
78             else if(op == 3)
79             {
80                 a = hang[a];
81                 b = lie[b];
82                 printf("%d\n",query(k,a,b));
83             }
84         }
85     }
86     return 0;
87 }        
88 /*
89 5
90 4 4 4dlsdfflsfls
91 1 1 1
92 2 4 4
93 3 2 2
94 4 4 3
95 */
View Code

 

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

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

原文:http://www.cnblogs.com/xiaxiaosheng/p/3909866.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!