HDU 3682 To Be an Dream Architect:查重三维坐标系中点在实数上的映射
Posted Leohh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于HDU 3682 To Be an Dream Architect:查重三维坐标系中点在实数上的映射的主要内容,如果未能解决你的问题,请参考以下文章
An error occurred while collecting items to be installed session context was:(profile=DefaultProfile
[NPM + React] Prepare a Custom React Hook to be Published as an npm Package
HDU 5653 Bomber Man wants to bomb an Array. DP
UVA10900 HDU1145 So you want to be a 2n-aire?概率期望