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