ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

E - Moat(状压&DSU)

2021-09-22 13:31:53  阅读:164  来源: 互联网

标签:DSU int 状压 36 long times 区域 Moat define


E - Moat(状压&DSU)

在这里插入图片描述

考虑每个位置是在区域内还是区域外,每个合法答案与区域的分布情况一一对应。

先状压,然后所有包含给定输入的情况,先将 4 × 4 4\times 4 4×4的矩阵外围一圈变成 6 × 6 6\times 6 6×6的大小,然后用dsu进行判断,若区域外集合大小和区域内集合大小刚好是36则满足条件。 这里用 6 × 6 6\times 6 6×6的目的,方便以 ( 0 , 0 ) (0,0) (0,0)作为区域外的一个点,然后我们对区域内的一个点做标记,然后进行并查集即可。

时间复杂度: O ( 36 × 2 16 ) O(36\times 2^{16}) O(36×216)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\n",a[n]); 
}
int s[N],sz[N];
int find(int x){return x==s[x]?x:s[x]=find(s[x]);}
void Init(int n){
	for(int i=0;i<n;i++) s[i]=i,sz[i]=1;
}
void merge(int u,int v){
	u=find(u),v=find(v);
	if(u!=v){
		s[u]=v;
		sz[v]+=sz[u];
	}
}
int id(int i,int j){
	return i*6+j;
}
int n;
bool vis[6][6];
int main(){
	IOS;
	rep(i,1,4)
		rep(j,1,4){
			int x;cin>>x;n=(n<<1)+x;
		}
	int st=1<<16;
	int u=0,ans=0;
	for(int k=0;k<st;k++)
		if((k&n)==n)
	{
		Init(36);
		int v=0;
		for(int j=0;j<16;j++){
			int x=j/4,y=j%4;
			if(k>>j&1){
				v=(x+1)*6+(y+1);
				vis[x+1][y+1]=true;
			}
			else vis[x+1][y+1]=false;
		}
		for(int i=0;i<6;i++)
			for(int j=0;j<6;j++){
				if(i+1<6&&vis[i][j]==vis[i+1][j]) merge(id(i,j),id(i+1,j));
				if(j+1<6&&vis[i][j]==vis[i][j+1]) merge(id(i,j),id(i,j+1));
			}
		ans+=(sz[find(0)]+sz[find(v)]==36);
	}
	cout<<ans<<'\n';
	return 0;
}

标签:DSU,int,状压,36,long,times,区域,Moat,define
来源: https://blog.csdn.net/weixin_45750972/article/details/120413237

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有