传送门

有个十分显然的结论,只用枚举前后两个面就可以知道所有的面的颜色。

于是可以O(n2)O(n^2)O(n2)枚举前后两个面然后用map乱搞求贡献。

发现这样算出来会多算两倍(打表证明)于是答案除以3。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 405
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n,col[N][4];
ll ans=0,mp[N][4];
map<ll,int>cnt;
inline ll idx(int a,int b,int c,int d){return 1ll*a+1ll*b*1000+1ll*c*1000000+1ll*d*1000000000;}
int main(){
	n=read();
	for(int i=1;i<=n;++i)for(int j=0;j<=3;++j)col[i][j]=read();
	for(int i=1;i<=n;++i){
		mp[i][0]=idx(col[i][0],col[i][1],col[i][2],col[i][3]);
		mp[i][1]=idx(col[i][1],col[i][2],col[i][3],col[i][0]);
		mp[i][2]=idx(col[i][2],col[i][3],col[i][0],col[i][1]);
		mp[i][3]=idx(col[i][3],col[i][0],col[i][1],col[i][2]);
		for(int j=0;j<4;++j)++cnt[mp[i][j]];
	}
	for(int i=1;i<=n;++i){
		for(int j=0;j<4;++j)--cnt[mp[i][j]];
		for(int j=i+1;j<=n;++j){
			if(i==j)continue;
			for(int k=0;k<4;++k)--cnt[mp[j][k]];
			for(int k=0;k<4;++k){
				ll tmp[16],ttmp=1;
				tmp[0]=idx(col[i][0],col[i][3],col[j][k],col[j][(k+3)%4]);
				tmp[4]=idx(col[j][(k+3)%4],col[i][0],col[i][3],col[j][k]);
				tmp[8]=idx(col[j][k],col[j][(k+3)%4],col[i][0],col[i][3]);
				tmp[12]=idx(col[i][3],col[j][k],col[j][(k+3)%4],col[i][0]);
				tmp[1]=idx(col[i][1],col[i][0],col[j][(k+3)%4],col[j][(k+2)%4]);
				tmp[5]=idx(col[j][(k+2)%4],col[i][1],col[i][0],col[j][(k+3)%4]);
				tmp[9]=idx(col[j][(k+3)%4],col[j][(k+2)%4],col[i][1],col[i][0]);
				tmp[13]=idx(col[i][0],col[j][(k+3)%4],col[j][(k+2)%4],col[i][1]);
				tmp[2]=idx(col[i][2],col[i][1],col[j][(k+2)%4],col[j][(k+1)%4]);
				tmp[6]=idx(col[j][(k+1)%4],col[i][2],col[i][1],col[j][(k+2)%4]);
				tmp[10]=idx(col[j][(k+2)%4],col[j][(k+1)%4],col[i][2],col[i][1]);
				tmp[14]=idx(col[i][1],col[j][(k+2)%4],col[j][(k+1)%4],col[i][2]);
				tmp[3]=idx(col[i][3],col[i][2],col[j][(k+1)%4],col[j][k]);
				tmp[7]=idx(col[j][k],col[i][3],col[i][2],col[j][(k+1)%4]);
				tmp[11]=idx(col[j][(k+1)%4],col[j][k],col[i][3],col[i][2]);
				tmp[15]=idx(col[i][2],col[j][(k+1)%4],col[j][k],col[i][3]);
				if(cnt[tmp[0]]==0||cnt[tmp[1]]==0||cnt[tmp[2]]==0||cnt[tmp[3]]==0)continue;
				for(int l=0;l<4;++l){
					ttmp*=cnt[tmp[l]];
					for(int m=l;m<16;m+=4)--cnt[tmp[m]];
				}
				for(int l=0;l<16;++l)++cnt[tmp[l]];
				ans+=ttmp;
			}
			for(int k=0;k<4;++k)++cnt[mp[j][k]];
		}
		for(int j=0;j<4;++j)++cnt[mp[i][j]];
	}
	cout<<ans/3;
	return 0;
}

2018.09.20 atcoder Building Cubes with AtCoDeer(枚举)的更多相关文章

  1. 2018.09.20 atcoder Painting Graphs with AtCoDeer(tarjan+polya)

    传送门 一道思维题. 如果没有环那么对答案有k的贡献. 如果恰为一个环,可以用polya求贡献. 如果是一个有多个环重叠的双联通的话,直接转化为组合数问题(可以证明只要每种颜色被选取的次数相同一定可以 ...

  2. 2018.09.20 atcoder 1D Reversi(模拟)

    传送门 考虑每次摆石头都会消去最外层的一个连续颜色串. 所以只用统计一下有多少段颜色即可. 代码: #include<bits/stdc++.h> using namespace std; ...

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

    题目传送门:https://arc062.contest.atcoder.jp/tasks/arc062_c 题目大意: 给你\(N\)块正方形木板,每块木板四角有四种颜色(可以相同),木板中央有编号 ...

  4. 2018.09.19 atcoder AtCoDeer and Rock-Paper(贪心)

    传送门 sb贪心啊. 显然能选帕子就选帕子. 首先假设第一个人全出石头. 考虑把一些石头修改成帕子. 这样贡献只增不减,加起来就是答案. 代码: #include<bits/stdc++.h&g ...

  5. 2018.09.19 atcoder AtCoDeer and Election Report(贪心)

    传送门 很有意思的一道贪心. 就是每次翻最小的倍数来满足条件. 代码: #include<bits/stdc++.h> #define ll long long using namespa ...

  6. 2018.09.19 atcoder Snuke's Coloring(思维题)

    传送门 谁能想到这道题会写这么久. 本来是一道很sb的题啊. 就是每次选一个点只会影响到周围的九个方格,随便1e9进制就可以hash了,但是我非要作死用stl写. 结果由于技术不够高超,一直调不出来. ...

  7. 2018.09.02 Atcoder Regular Contest 102简要题解

    比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...

  8. 2018.09.23 atcoder Boxes and Candies(贪心)

    传送门 一道挺有意思的贪心. 从1到n依次满足条件. 注意要特判第一个数已经大于x的情况. 但是如何贪心吃呢? 如果靠左的数没有越界,我们吃靠右的数. 原因是下一次靠右的数就会成为靠左的数,相当于多贡 ...

  9. 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)

    传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...

随机推荐

  1. ASP.net显示当前系统在线人数

    void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 Application.Lock(); if (Applic ...

  2. 微信公众号开发者模式自定义菜单 node

    纯属分享 var config = require('./admin/wx/config/config'); var API = require('wechat-api'); var api = ne ...

  3. linux的基础

    vmtools 的安装:作用 ——>共享linux和windows的文件夹 reboot 重启 远程登录 : 远程登录时要打开sshd(监视22端口) 怎么设施sshd: 打开远端,输入setu ...

  4. python global nonlocal

    global: 方法之外在modual中的变量定义为全局变量.方法内的变量为局部变量. 一般情况下,全局变量可以被使用,但是不应该被修改,不然会报错. 不过一般不建议对全局变量做修改,如果有多个方法都 ...

  5. visibility和display

    visibility: hidden----将元素隐藏,但是在网页中该占的位置还是占着.display: none----将元素的显示设为无,即在网页中不占任何的位置.

  6. mongodb基础学习12-分组group操作

    group可以实现常用的统计操作,如求最大值,最小值,求和 其中reduce是最关键的操作,是对每一条记录的具体操作 下面来看例子: 分组count求和 部分结果 下面的加了个查询条件,即查询价格大于 ...

  7. Spring MVC 接受的请求参数

    目录 1. 概述 2. 详解 2.1 处理查询参数 2.2 处理路径参数接受输入 2.3 处理表单 3. 补充内容 3.1 Ajax/JSON 输入 3.2 multipart参数 3.3 接收 he ...

  8. asp.net core in centos

    CentOS 7部署ASP.NET Core应用程序   看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大家伙元旦快乐.不 ...

  9. 扩展C#与元编程(一)

    众所周知,Roslyn project已经开源一年多了.简单的说,Roslyn是:1)用C#/VB写的C#/VB的编译器,以及与IDE集成:2)编译器的功能以API的方式暴露出来(即一组DLL). R ...

  10. SQL 变量、 运算符、 if 、while

    变量: SQL语言也跟其他编程语言一样,拥有变量.分支.循环等控制语句. 在SQL语言里面把变量分为局部变量和全局变量,全局变量又称系统变量. 局部变量: 使用declare关键字给变量声明,语法非常 ...