题目传送门:https://arc062.contest.atcoder.jp/tasks/arc062_c

题目大意:

给你\(N\)块正方形木板,每块木板四角有四种颜色(可以相同),木板中央有编号,求选出6块不同的板子,围成的本质不同的合法立方体的个数。一个合法立方体,当且仅当木板有编号的一面在外面,且立方体顶点处的三个颜色相同。由于编号的存在,木板可以有4种形态。两个立方体本质相同,当且仅当存在一种空间旋转方式,使得两个立方体一模一样(包括编号方向)


没想到这题巨暴力……当我们确定对面的两块木板后,整个立方体就确定了……暴力枚举,然后去重一下就做完了……

  1. /*program from Wolfycz*/
  2. #include<map>
  3. #include<cmath>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<iostream>
  7. #include<algorithm>
  8. #define Fi first
  9. #define Se second
  10. #define inf 0x7f7f7f7f
  11. #define min(x,y) (x<y?x:y)
  12. #define max(x,y) (x>y?x:y)
  13. using namespace std;
  14. typedef long long ll;
  15. typedef unsigned int ui;
  16. typedef unsigned long long ull;
  17. inline char gc(){
  18. static char buf[1000000],*p1=buf,*p2=buf;
  19. return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
  20. }
  21. inline int frd(){
  22. int x=0,f=1; char ch=gc();
  23. for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
  24. for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';
  25. return x*f;
  26. }
  27. inline int read(){
  28. int x=0,f=1; char ch=getchar();
  29. for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
  30. for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
  31. return x*f;
  32. }
  33. inline void print(int x){
  34. if (x<0) putchar('-'),x=-x;
  35. if (x>9) print(x/10);
  36. putchar(x%10+'0');
  37. }
  38. const int N=4e2;
  39. int C[N+10][4];
  40. ll v[N+10];
  41. map<ll,int>Mp;
  42. ll Hash(int a,int b,int c,int d){return ((ll)a<<30)|((ll)b<<20)|((ll)c<<10)|(ll)d;}
  43. void Add(ll x,int v){//一种Hash方法
  44. for (int i=0;i<4;i++,x=(x>>10)|((x&1023)<<30)){
  45. if (Mp.find(x)==Mp.end()) Mp.insert(map<ll,int>::value_type(x,0));
  46. Mp.find(x)->Se+=v;
  47. }
  48. }
  49. int main(){
  50. int n=read(); ll Ans=0;
  51. for (int i=1;i<=n;i++){
  52. for (int j=0;j<4;j++)
  53. C[i][j]=read();
  54. v[i]=Hash(C[i][0],C[i][1],C[i][2],C[i][3]);
  55. Add(v[i],1);
  56. }
  57. for (int i=1;i<n-4;i++){
  58. Add(v[i],-1);
  59. for (int j=i+1;j<=n;j++){
  60. Add(v[j],-1);
  61. for (int k=0;k<4;k++){
  62. static ll A[4];
  63. A[0]=Hash(C[i][1],C[i][0],C[j][(k+1)%4],C[j][k %4]);
  64. A[1]=Hash(C[i][2],C[i][1],C[j][k %4],C[j][(k+3)%4]);
  65. A[2]=Hash(C[i][3],C[i][2],C[j][(k+3)%4],C[j][(k+2)%4]);
  66. A[3]=Hash(C[i][0],C[i][3],C[j][(k+2)%4],C[j][(k+1)%4]);
  67. //自己画图带入一下即可
  68. int a=0,b=0,c=0,d=0;
  69. map<ll,int>::iterator it;
  70. if ((it=Mp.find(A[0]))==Mp.end()) continue;
  71. else a=it->Se;
  72. if ((it=Mp.find(A[1]))==Mp.end()) continue;
  73. else b=it->Se;
  74. if ((it=Mp.find(A[2]))==Mp.end()) continue;
  75. else c=it->Se;
  76. if ((it=Mp.find(A[3]))==Mp.end()) continue;
  77. else d=it->Se;
  78. if (!a||!b||!c||!d) continue;
  79. ll res=1;
  80. for (int l=0;l<4;l++){
  81. res*=Mp.find(A[l])->Se;
  82. Add(A[l],-1);
  83. }
  84. Ans+=res;
  85. for (int l=0;l<4;l++) Add(A[l],1);
  86. }
  87. Add(v[j],1);
  88. }
  89. }
  90. printf("%lld\n",Ans);
  91. return 0;
  92. }

AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer的更多相关文章

  1. [Atcoder Regular Contest 062] Tutorial

    Link: ARC 062 传送门 C: 每次判断增加a/b哪个合法即可 并不用判断两个都合法时哪个更优,因为此时两者答案必定相同 #include <bits/stdc++.h> usi ...

  2. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  3. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  4. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  5. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  6. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  7. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  8. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  9. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

随机推荐

  1. Django 之 中间件

    一.概念 1.什么是中间件? 官方解释:中间件是用来处理Django的请求和响应的框架级别的钩子.基于全局范围产生影响. 平民解释:中间件是帮助我们在视图函数执行前和执行后做的操作.它本质上就是一个自 ...

  2. yum lock

    状态 :睡眠中,进程ID:18439Another app is currently holding the yum lock; waiting for it to exit... 另一个应用程序是: ...

  3. RabbitMQ Connector

    https://ci.apache.org/projects/flink/flink-docs-master/dev/connectors/rabbitmq.html RabbitMQ Source ...

  4. Mongoose Embedded Web Server Library

    https://github.com/cesanta/mongoose http://ltp.ai/docs/ltpserver.html LTP Server在轻量级服务器程序mongoose基础上 ...

  5. ossfs常见配置错误

    以下问题出现在非root用户下 执行echo ××××> /etc/passwd-ossfs  bash: /etc/passwd-ossfs: Permission denied 使用sudo ...

  6. em和i , b和Strong 的区别

    这两对标签最大区别就是一个给搜索引擎看的,一个是给用户看的. b标签和strong标签给我们的主观感受都是加粗,但对搜索引擎来说b标签和普通的文字并没有什么区别,而strong标签却是起强调作用的. ...

  7. Codeforces Round #326 (Div. 2)

    B. Duff in Love time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  8. (linux)main.c中的初始化

    main.c中的初始化 head.s在最后部分调用main.c中的start_kernel() 函数,从而把控制权交给了它. 所以启动程序从start_kernel()函数继续执行.这个函数是main ...

  9. HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流

    题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    ...

  10. 使用pyinstaller----python转exe

    自己写了一个定时清理日志的脚步,因为服务器是Windows,不想部署Python环境,就考虑到转成exe文件即可. 从网上了解到python转exe方法比较多,我选用了pyinstaller,过程比较 ...