题目链接: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 }
时间: 2024-11-02 09:09:23