HDU 3682 To Be an Dream Architect:查重【三維座標系中點在實數上的對映】

Leohh發表於2017-08-17

題目連結: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 }

 

相關文章