首页 > 其他分享 >luogu P7352 炉心融解

luogu P7352 炉心融解

时间:2023-08-07 22:14:50浏览次数:35  
标签:nxt P7352 融解 int luogu back 炉心 now

记 \(f_S\) 为所有人以当前信息推断出 \(S\) 这种情况是否合法,\(g_S\) 表示假如真实情况是 \(S\),应该有哪些人喊出来了。

每一轮中,通过告诉你的 \(k\) 条消息可以推断出哪些集合不合法,将其 \(f_S\) 赋为 \(0\),然后根据新的 \(f_S\),有些人可能可以据此喊了,所以根据新的 \(f_S\) 更新 \(g_S\)。那本质上真实集合确定,如果某种可能的情况喊的人与真实喊的人不一致,即 \(g_S \neq g_X\),\(X\) 为真实情况,则这种情况不可能,将 \(f_S\) 设成 \(0\)。

#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;
}

标签:nxt,P7352,融解,int,luogu,back,炉心,now
From: https://www.cnblogs.com/hikkio/p/17612855.html

相关文章

  • 【题解】Luogu[P9504] 『MGOI』Simple Round I C. 魔法禁林
    Link这题我们发现如果直接去枚举生命和法力值显然是不行的,又看到说最小的生命值,不禁想到最短路,但是怎么跑?我们令经过一条边之前魔力值为\(k\),那么该边的边权为\(\lfloor\dfrac{w}{k}\rfloor\),于是我们讲题目转化为了边权为\(\lfloor\dfrac{w}{k}\rfloor\)时\(s\)到\(t\)......
  • 【LuoGU 1462】通往奥格瑞玛的道路——最短路+二分
    通往奥格瑞玛的道路题目背景在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量。有一天他醒来后发现自己居然到了联盟的主城暴风城。在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛。题目描述在艾泽拉斯,有\(n\)个城市。编号为\(1,2,3,\ldots,n\)。......
  • [刷题笔记] LuoguP1156 垃圾陷阱
    ProblemDescription题目描述了几个状态,我们来理顺一下:一头牛掉进了坑里,农夫会在几个时段向下扔垃圾,牛初始可以撑10h,对于每一个垃圾,牛可以:把它堆起来,一旦垃圾堆的高度超过\(h\),她就可以爬出来吃掉它垃圾好吃吗,并且获得能量值需要注意的是,牛可以撑到下一次垃圾投放的标......
  • [刷题笔记] Luogu P2014 [CTSC1997] 选课
    ProblemSolution我们发现本题中有好多主从关系,即要想取用一个儿子必须先取用她的父亲。构成了一个森林,处理不便。有个小技巧,就是将0号节点参与建树,最后所求节点数就变成了\(m+1\),且把森林变成了一棵树。然后如何处理呢?再次理解题意,我们发现,我们每次的决策是是否取用儿子,取用......
  • [刷题笔记][算法模型总结] Luogu P1880 [NOI1995] 石子合并 || 区间dp之合并石子模型
    ProblemSolution本题还有一个弱化版,见LuoguP1775我们发现本题和弱化版唯一区别就是本题有环。我们先将弱化版的内容。EasyversionDescription弱化版是给定了好多堆石子,每相邻的两堆可以合并成一个大堆,每次合并会产生两个石头重量和的价值,最后会将若干堆石子合并为一堆。......
  • [Luogu P8744] 左孩子右兄弟 题解
    题目大意给定一棵节点个数为\(N\)的多叉树,求其通过"左孩子右兄弟"表示法转化成的二叉树,高度最高是多少。解决思路首先分辨出此题目是树状DP,并了解"左孩子右兄弟"表示法的转换方式,便开始考虑DP的状态转移方程。状态由于每个节点由\(1\)至\(N\)编号,那么就使用\(dp_{k......
  • 【题解】Luogu[P5022] [NOIP2018 提高组] 旅行
    Link因为是道NOIP,那么我们不妨按照考场上的策略一点一点想。先看部分分,有一档有很明显的特征\(n=m-1\)这显然构成一棵树,对于一棵树,我们想把他按照题目的要求遍历完,一定是像dfs的遍历顺序一样,对于一个点,必然遍历完以它为根的子树,才能回到它的父亲节点,于是就有了一个很明显的贪......
  • [刷题笔记] Luogu P1853 投资的最大效益
    ProblemSolution刚开始看这道题的时候不自主的想到了纪念品,但其实本题和纪念品还是有区别的。纪念品规定了每次只能买一个纪念品,而本题可以买无限个纪念品需要在原本的基础上买进卖出,钱有进有出,而本题时只有进,稳赚不赔。本题和纪念品不同的第一点决定了它时完全背包,纪念品......
  • [刷题笔记] Luogu P5662 [CSP-J2019] 纪念品
    ProblemDescription类似于炒股票,有买进有卖出,当天可以既买进又卖出无限次,现在有若干件物品,每件物品都有一个价格,每天每件物品的价格不一致,你初始有\(m\)元钱,想要通过若干次购进卖出的操作,使得\(T\)天后你手里的钱最多。要求:\(T\)天结束你手中的股票必须全部售出。Solution乍看......
  • [刷题笔记] Luogu P1466 [USACO2.2] 集合 Subset Sums
    ProblemDescription有一个长度为\(n\)的数组为\(1-n\),求有多少种选择方案使得选择数之和等于序列和的一半Solution题面翻译成这样是不是就好做了?首先,序列和的一半我们可以计算出\(n\times(n+1)\div2\div2\),显然序列和的一半只有是整数才有解,如果不是整数直接输出0即可。......