HDU 3682 To Be an Dream Architect:查重【三维坐标系中点在实数上的映射】

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

题意:

  有一个n*n*n的立方体,左下角坐标为(1,1,1),接下来进行m次操作。

  每个操作形如这样:"axis_1=a,axis_2=b".

  例如:"x=3,y=1",意思是消去所有x=3,y=1的方块。

  RT:

  

  

题解:

  问题的唯一矛盾在于:一个位置的方块可能被多次消去。

  所以。。。

  (1)由于每一个坐标(x,y,z)在实数中有唯一映射:x*n*n+y*n+z,为了节省空间,将坐标化为整数。

  (2)每操作一次,枚举消去的方块,将坐标对应的整数添加到数组中。

  (3)所有操作完成后,对数组排序。

  (4)然后扫一遍,统计不同整数的个数,即为答案。

  Tips:用set居然会MLE。。。

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <algorithm>
 5 #define MAX_N 1000005
 6 
 7 using namespace std;
 8 
 9 int n,m,t;
10 int cnt;
11 int ans;
12 int arr[MAX_N];
13 
14 int main()
15 {
16     cin>>t;
17     for(int cas=1;cas<=t;cas++)
18     {
19         cin>>n>>m;
20         cnt=0;
21         ans=0;
22         for(int i=0;i<m;i++)
23         {
24             int a,b;
25             char c1,c2;
26             cin>>c1;
27             getchar();
28             cin>>a;
29             getchar();
30             cin>>c2;
31             getchar();
32             cin>>b;
33             if(c1>c2)
34             {
35                 swap(a,b);
36                 swap(c1,c2);
37             }
38             if(c1=='X' && c2=='Y')
39             {
40                 for(int c=1;c<=n;c++)
41                 {
42                     arr[cnt++]=a*n*n+b*n+c;
43                 }
44             }
45             else if(c1=='X' && c2=='Z')
46             {
47                 for(int c=1;c<=n;c++)
48                 {
49                     arr[cnt++]=a*n*n+c*n+b;
50                 }
51             }
52             else
53             {
54                 for(int c=1;c<=n;c++)
55                 {
56                     arr[cnt++]=c*n*n+a*n+b;
57                 }
58             }
59         }
60         sort(arr,arr+cnt);
61         arr[cnt]=-1;
62         for(int i=0;i<cnt;i++)
63         {
64             if(arr[i]!=arr[i+1]) ans++;
65         }
66         cout<<ans<<endl;
67     }
68 }
原文地址:https://www.cnblogs.com/Leohh/p/7383054.html