• 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 }
  • 相关阅读:
    雷霆战机
    各种 Python 库/模块/工具
    redis
    25
    为什么Python中“2==2>1”结果为True
    thinkphp3.2路由美化,url简化
    thinkphp调整框架核心目录think的位置
    thinkphp3.2中开启静态缓存后对404页面的处理方法
    thinphp中volist嵌套循环时变量$i 被污染问题,key="k"
    thinkphp中如何是实现多表查询
  • 原文地址:https://www.cnblogs.com/Leohh/p/7383054.html
Copyright © 2020-2023  润新知