• 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 }
  • 相关阅读:
    jenkins as code 与go语言学习
    VC++ 网络编程总结(一)
    Linux下的C高级编程---学习
    面试前必做4准备
    MFC视图切换大全总结
    多线程编程技术学---学习笔记--线程编程基础知识
    C语言高效编程的几招(绝对实用,绝对经典)
    汇编语言(学习笔记-----[bx]和loop)
    汇编语言(学习笔记----源程序)
    汇编语言(学习笔记----寄存器-内存访问)
  • 原文地址:https://www.cnblogs.com/Leohh/p/7383054.html
Copyright © 2020-2023  润新知