luogu P7352 炉心融解
记
每一轮中,通过告诉你的
#include <bits/stdc++.h>
using namespace std;
const int maxn=20;
int n,m,S,U,f[(1<<16)],g[(1<<16)];
int t[maxn];
bool check(int X,int i,int pre,int nxt,int type)
{
int tnow=(U^(1<<pre)^(1<<nxt))&X;
int t00=f[tnow],t01=f[tnow|(1<<nxt)],t10=f[tnow|(1<<pre)],t11=f[tnow|(1<<nxt)|(1<<pre)];
if(type==1)
{
if((!t00&&!t11)||(!t01&&!t10))return 1;
}
if(type==0)
{
if((!t00)||(!t01&&!t10&&!t11))return 1;
}
return 0;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++)t[i]=-1;
for(int i=0,x;i<n;i++)
{cin>>x;S|=x<<i;}
U=(1<<n)-1;
vector<int> now;
for(int i=0;i<(1<<n);i++)f[i]=1,now.push_back(i);
for(int i=1;i<=m;i++)
{
vector<int> nxt;
int k,p,x,T,v;cin>>k;
for(int j=1;j<=k;j++)
{
cin>>p;T=0;
for(int t=1;t<=p;t++){cin>>x;T|=(1<<x);}
cin>>v;nxt.clear();
for(int s:now)
if(((v==0?(~s):(s))&T))nxt.push_back(s);
else {f[s]=0;}
swap(now,nxt);
}
for(int s:now)
for(int j=0;j<n;j++)
{
if(g[s]&(1<<j))continue;
int pre=(j?j-1:n-1),nxt=(j==n-1?0:j+1);
if(check(s,j,pre,nxt,(s>>j)&1))g[s]|=(1<<j);
}
for(int j=0;j<n;j++)if(t[j]==-1&&((g[S]>>j)&1))t[j]=i;
nxt.clear();
for(int s:now)
if(g[s]==g[S])nxt.push_back(s);
else f[s]=0;
swap(now,nxt);
}
for(int i=0;i<n;i++)cout<<t[i]<<' ';
return 0;
}
本文作者:_kkio
本文链接:https://www.cnblogs.com/hikkio/p/17612855.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步