【arc062e】Building Cubes with AtCoDeer

Description

STL有n块瓷砖,编号从1到n,并且将这个编号写在瓷砖的正中央;

瓷砖的四个角上分别有四种颜色(可能相等可能不相等),并且用Ci,0,Ci,1,Ci,2,Ci,3分别表示左上、右上、右下、左下的颜色。颜色有1000种,编号从0到999。

现在STL想知道,从这n块瓷砖中选出不同的6块,能围成多少本质不同的合法的立方体。

一个立方体被称为合法的,当且仅当瓷砖有编号的一侧在外面,并且立方体的每个顶点处的三个颜色相同。

注意,由于瓷砖的中间是写着编号的,因此将一个瓷砖旋转90度之后,这个瓷砖会发生变化,也就是说一块瓷砖可以被用作四个方向(哪怕旋转后四个角的颜色对应相等)。

两个立方体被称作是本质相同的,当且仅当存在在空间中旋转一个立方体的方式,使其和第二个立方体一模一样(包括每面瓷砖上编号的方向)。


Solution

n最大为400,显然可以暴力解决。

我们可以发现,当一个立方体中,只要确定了任意两个相对的面,就可唯一确定整个立方体。

因此我们枚举相对两面编号及编号方向,用map储存瓷砖,计算方案即可。

ps:由于正方形可旋转,因此存入map时,要将旋转4次的结果都存入map中。

Code

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<map>
 5 using namespace std;
 6 #define hash func
 7 typedef long long ll;
 8 int n,c[410][4];
 9 ll ans=0,h[410];
10 map<ll,int>mp;
11 ll hash(ll a,ll b,ll c,ll d){
12     return a<<30|b<<20|c<<10|d;
13 }
14 void add(ll x,int k){
15     for(int i=4;i;x=x>>10|(x&1023)<<30,i--)
16         mp[x]+=k;
17     return;
18 }
19 int main(){
20     mp.clear();
21     scanf("%d",&n);
22     for(int i=1;i<=n;i++){
23         scanf("%d%d%d%d",c[i]+0,c[i]+1,c[i]+2,c[i]+3);
24         h[i]=hash(c[i][0],c[i][1],c[i][2],c[i][3]);
25         add(h[i],1);
26     }
27     for(int i=1;i<n-4;i++){
28         add(h[i],-1);
29         for(int j=i+1;j<=n;j++){
30             add(h[j],-1);
31             for(int k=0;k<4;k++){
32                 ll a[4];
33                 a[0]=hash(c[i][3],c[i][2],c[j][(k+1)%4],c[j][k]);
34                 a[1]=hash(c[i][2],c[i][1],c[j][(k+2)%4],c[j][(k+1)%4]);
35                 a[2]=hash(c[i][1],c[i][0],c[j][(k+3)%4],c[j][(k+2)%4]);
36                 a[3]=hash(c[i][0],c[i][3],c[j][k],c[j][(k+3)%4]);
37                 if(mp[a[0]]==0||mp[a[1]]==0||mp[a[2]]==0||mp[a[3]]==0)
38                     continue;
39                 ll res=1;
40                 for(int l=0;l<4;l++){
41                     res*=mp[a[l]];
42                     add(a[l],-1);
43                 }
44                 ans+=res;
45                 for(int l=0;l<4;l++)
46                     add(a[l],1);
47             }
48             add(h[j],1);
49         }
50     }
51     printf("%lld\n",ans);
52     return 0;
53 }

原文地址:https://www.cnblogs.com/gzez181027/p/arc062e.html

时间: 2024-10-07 23:15:01

【arc062e】Building Cubes with AtCoDeer的相关文章

【poj2741】 Colored Cubes

http://poj.org/problem?id=2741 (题目链接) 这也是道神题.. 题意:给出n个骰子,每一面都有一种颜色,问最少更改多少个面的颜色可以使所有骰子通过旋转后完全相同. solution  设6个面的编号为1~6,从中选一个作为顶面,再选一个作为正面,那么其它面都可以确定(因为有对面的面也确定了),因此每个骰子有6*4=24种姿态,每种姿态对应一个全排列P,P[i]表示i所在的位置.所以我们手打这24种排列.  接下来看看如何暴力.我们考虑先枚举每个立方体的姿态(第一个作

【HDU6024】Building Shops

题意 有n个教室排成一排,每个教室都有一个坐标,现在,小Q想建一些糖果商店,在这n个教室里面.总的花费有两部分,在教室i建一个糖果屋需要花费ci,对于没有任何糖果屋的P,需要的花费为这个教室到它左边有糖果商店的距离.怎么建糖果商店才能使花费最少?n<=3000. 分析 比较显然的dp,每个教室有两种选择,建糖果教室或者 不建糖果教室.f[i][0]第i个教室不建糖果商店时的最少花费.f[i][1]第i个教室建糖果商店时的最少花费.直接转移的话复杂度时O(N^3)的.我们可以预处理出所有i,j直接

AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer

题目传送门:https://arc062.contest.atcoder.jp/tasks/arc062_c 题目大意: 给你\(N\)块正方形木板,每块木板四角有四种颜色(可以相同),木板中央有编号,求选出6块不同的板子,围成的本质不同的合法立方体的个数.一个合法立方体,当且仅当木板有编号的一面在外面,且立方体顶点处的三个颜色相同.由于编号的存在,木板可以有4种形态.两个立方体本质相同,当且仅当存在一种空间旋转方式,使得两个立方体一模一样(包括编号方向) 没想到这题巨暴力--当我们确定对面的两

【Unity3D】生成工程报错解决—UnityEditor.HostView:OnGUI() Error building Player: Couldn&#39;t build player because of unsupported data on target platform.

错误 错误1:An asset is marked as dont save, but is included in the build: unityEditor.HostView:OnGUI() 错误2:Building - Failed to write file: sharedassets0.assetsUnityEditor.HostView:OnGUI() 错误3:Error building Player: Couldn't build player because of unsup

【POJ2482】【线段树】Stars in Your Window

Description Fleeting time does not blur my memory of you. Can it really be 4 years since I first saw you? I still remember, vividly, on the beautiful Zhuhai Campus, 4 years ago, from the moment I saw you smile, as you were walking out of the classroo

【技巧】谷歌地图操作类

原文:[技巧]谷歌地图操作类 /********************************************************************************Name:谷歌地图操作类Author:刘皓Date:2012.8.13Desc:该类封装谷歌地图的一些操作version:1.0*********************************************************************************/ ///*一些全

【git】git与github的英文记录

Pull requests  Issues Gist 请求 问题 要点 ------------------------------------------------------------------------------------------- Learn Git and GitHub without any code! 没有任何代码学习Git和GitHub! ---------------------------------------------------------------

【分享】数据挖掘学习资料免费下载

 Artificial Intelligence - Wiley - Data Mining - Concepts Models Methods and Algorithms - 2003.chm 8.4 MB  IEEE - Finding Patterns in Three Dimensional Graphs Algorithms and Applications to Scientific Data Mining.pdf 561.8 KB  Mining The Web - Discov

【ruby】ruby基础知识

Install Ruby(安装) For windows you can download Ruby from http://rubyforge.org/frs/?group_id=167 for Linux tryhttp://www.rpmfind.net. Our first program(从此开始) Enter the following into the file, "test.rb". ? 1 puts "Howdy!" At the C: promp