1. 程式人生 > >HDU 3682 To Be an Dream Architect:查重【三維坐標系中點在實數上的映射】

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

方塊 由於 sort .cn 三維 esp ring 空間 接下來

題目鏈接: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 }

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