2018.09.20 atcoder Building Cubes with AtCoDeer(枚举)
传送门
有个十分显然的结论,只用枚举前后两个面就可以知道所有的面的颜色。
于是可以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(枚举)的更多相关文章
- 2018.09.20 atcoder Painting Graphs with AtCoDeer(tarjan+polya)
传送门 一道思维题. 如果没有环那么对答案有k的贡献. 如果恰为一个环,可以用polya求贡献. 如果是一个有多个环重叠的双联通的话,直接转化为组合数问题(可以证明只要每种颜色被选取的次数相同一定可以 ...
- 2018.09.20 atcoder 1D Reversi(模拟)
传送门 考虑每次摆石头都会消去最外层的一个连续颜色串. 所以只用统计一下有多少段颜色即可. 代码: #include<bits/stdc++.h> using namespace std; ...
- AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer
题目传送门:https://arc062.contest.atcoder.jp/tasks/arc062_c 题目大意: 给你\(N\)块正方形木板,每块木板四角有四种颜色(可以相同),木板中央有编号 ...
- 2018.09.19 atcoder AtCoDeer and Rock-Paper(贪心)
传送门 sb贪心啊. 显然能选帕子就选帕子. 首先假设第一个人全出石头. 考虑把一些石头修改成帕子. 这样贡献只增不减,加起来就是答案. 代码: #include<bits/stdc++.h&g ...
- 2018.09.19 atcoder AtCoDeer and Election Report(贪心)
传送门 很有意思的一道贪心. 就是每次翻最小的倍数来满足条件. 代码: #include<bits/stdc++.h> #define ll long long using namespa ...
- 2018.09.19 atcoder Snuke's Coloring(思维题)
传送门 谁能想到这道题会写这么久. 本来是一道很sb的题啊. 就是每次选一个点只会影响到周围的九个方格,随便1e9进制就可以hash了,但是我非要作死用stl写. 结果由于技术不够高超,一直调不出来. ...
- 2018.09.02 Atcoder Regular Contest 102简要题解
比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...
- 2018.09.23 atcoder Boxes and Candies(贪心)
传送门 一道挺有意思的贪心. 从1到n依次满足条件. 注意要特判第一个数已经大于x的情况. 但是如何贪心吃呢? 如果靠左的数没有越界,我们吃靠右的数. 原因是下一次靠右的数就会成为靠左的数,相当于多贡 ...
- 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)
传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...
随机推荐
- 返回顶部 fixed oncheck(点击按钮)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Spring MVC 异常处理 - ResponseStatusExceptionResolver
作用在类和方法上面 更改返回的代码和错误消息 类上 通过throw new UserName***Exception()抛出 @ResponseStatus(value=HttpStatus.FORB ...
- js实现UTC时间转为北京时间,时间戳转为时间
用了阿里云的接口,发现其穿的日期是UTC格式的.需要转换. var utc_datetime = "2017-03-31T08:02:06Z"; function utc2beij ...
- UIScrollView判断用户划到底部 (可用于实现loading more)
-(void)scrollViewDidScroll:(UIScrollView *)scrollView { //当scrollview中content的竖直位移加上scrollView的高度大于等 ...
- JS 判断鼠标滚轮的上下滚动
JS 判断鼠标滚轮的上下滚动 <script type="text/javascript"> var scrollFunc = function (e) { e = ...
- Object-c 构造、析构函数
一.构造函数 在OC中凡是已init开头的函数我们都称之为构造函数,在声明构造函数的时候,不带参数的一般直接声明为“-(id)init”,带参数的一般声明为“-(id)initWith...”. @i ...
- delphi 颜色转换函数总结
unit UColor; interface uses windows, sysutils, classes, graphics; function HexToInt(Hexa: String): L ...
- ArcGIS案例学习笔记2_2
ArcGIS案例学习笔记2_2 联系方式:谢老师,135_4855_4328,xiexiaokui#qq.com 时间:第二天下午 2018年8月12日 案例1:模型构建器,山顶点提取 背景:数据量大 ...
- DBA 招聘
数据库管理员(资深) 眼控科技 10-19万 72小时反馈 上海 6小时前 大专及以上 2年以上经验 普通话 25-35岁 绩效奖金 带薪年假 午餐补助 定期体检 年底双薪 五险一金 职位描述: 工作 ...
- python没有switch,可以用字典来替代
python没有switch,是因为可以用字典来替代,具体方法如下: def add(x,y): print(x+y)def subtraction(x,y): print(x-y)def multi ...