zoukankan      html  css  js  c++  java
  • AtCoder Regular Contest 062 E

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

    题目大意:

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


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

    /*program from Wolfycz*/
    #include<map>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define Fi first
    #define Se second
    #define inf 0x7f7f7f7f
    #define min(x,y) (x<y?x:y)
    #define max(x,y) (x>y?x:y)
    using namespace std;
    typedef long long ll;
    typedef unsigned int ui;
    typedef unsigned long long ull;
    inline char gc(){
    	static char buf[1000000],*p1=buf,*p2=buf;
    	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    inline int frd(){
    	int x=0,f=1; char ch=gc();
    	for (;ch<'0'||ch>'9';ch=gc())	if (ch=='-')	f=-1;
    	for (;ch>='0'&&ch<='9';ch=gc())	x=(x<<3)+(x<<1)+ch-'0';
    	return x*f;
    }
    inline int read(){
    	int x=0,f=1; char ch=getchar();
    	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')	f=-1;
    	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<3)+(x<<1)+ch-'0';
    	return x*f;
    }
    inline void print(int x){
    	if (x<0)	putchar('-'),x=-x;
    	if (x>9)	print(x/10);
    	putchar(x%10+'0');
    }
    const int N=4e2;
    int C[N+10][4];
    ll v[N+10];
    map<ll,int>Mp;
    ll Hash(int a,int b,int c,int d){return ((ll)a<<30)|((ll)b<<20)|((ll)c<<10)|(ll)d;}
    void Add(ll x,int v){//一种Hash方法
    	for (int i=0;i<4;i++,x=(x>>10)|((x&1023)<<30)){
    		if (Mp.find(x)==Mp.end())	Mp.insert(map<ll,int>::value_type(x,0));
    		Mp.find(x)->Se+=v;
    	}
    }
    int main(){
    	int n=read(); ll Ans=0;
    	for (int i=1;i<=n;i++){
    		for (int j=0;j<4;j++)
    			C[i][j]=read();
    		v[i]=Hash(C[i][0],C[i][1],C[i][2],C[i][3]);
    		Add(v[i],1);
    	}
    	for (int i=1;i<n-4;i++){
    		Add(v[i],-1);
    		for (int j=i+1;j<=n;j++){
    			Add(v[j],-1);
    			for (int k=0;k<4;k++){
    				static ll A[4];
    				A[0]=Hash(C[i][1],C[i][0],C[j][(k+1)%4],C[j][k    %4]);
    				A[1]=Hash(C[i][2],C[i][1],C[j][k    %4],C[j][(k+3)%4]);
    				A[2]=Hash(C[i][3],C[i][2],C[j][(k+3)%4],C[j][(k+2)%4]);
    				A[3]=Hash(C[i][0],C[i][3],C[j][(k+2)%4],C[j][(k+1)%4]);
                    //自己画图带入一下即可
    				int a=0,b=0,c=0,d=0;
    				map<ll,int>::iterator it;
    				if ((it=Mp.find(A[0]))==Mp.end())	continue;
    				else	a=it->Se;
    				if ((it=Mp.find(A[1]))==Mp.end())	continue;
    				else	b=it->Se;
    				if ((it=Mp.find(A[2]))==Mp.end())	continue;
    				else	c=it->Se;
    				if ((it=Mp.find(A[3]))==Mp.end())	continue;
    				else	d=it->Se;
    				if (!a||!b||!c||!d)	continue;
    				ll res=1;
    				for (int l=0;l<4;l++){
    					res*=Mp.find(A[l])->Se;
    					Add(A[l],-1);
    				}
    				Ans+=res;
    				for (int l=0;l<4;l++)	Add(A[l],1);
    			}
    			Add(v[j],1);
    		}
    	}
    	printf("%lld
    ",Ans);
    	return 0;
    }
    
  • 相关阅读:
    python 的时间复杂度
    python之进制转换
    进程、线程、协程
    [GO]gtk的windows环境搭建
    [GO]并的爬取捧腹的段子
    [GO]并发的网络爬虫
    [GO]百度贴吧的爬虫
    [operator]jenkins+gitlab/Webhook自动构建发布
    [GO]并发实现聊天室服务器
    [GO]文件的收发服务器
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/10072714.html
Copyright © 2011-2022 走看看