首页 > 其他分享 >ARC143E Reversi

ARC143E Reversi

时间:2024-01-28 22:55:07浏览次数:24  
标签:ARC143E head int Reversi tot vis edge maxn

ARC143E Reversi

简单的分析题。

思路

如果分析一个节点状态,那么时不方便的。但可以注意到,状态的改变好相连的边数有关。

从叶子节点开始考虑。

  • 白色:在父亲翻转前选中,并改变父亲状态。
  • 黑色:在父亲翻转后选中。

这里可以用拓扑排序建边描述这个问题。

我们把叶子节点解决后,在按照一样的方法,逐层向上解决问题。

最后如果根节点变成黑色,那么无解,否则拓扑排序输出答案(可以开小根堆优先队列,先访问小点)。

CODE

#include<bits/stdc++.h>
using namespace std;

const int maxn=2e5+5;

struct Edge
{
    int tot;
    int head[maxn];
    struct edgenode{int to,nxt;}edge[maxn*2];
    void add(int x,int y)
    {
        tot++;
        edge[tot].to=y;
        edge[tot].nxt=head[x];
        head[x]=tot;
    }
}E,G;

int n;
int ind[maxn];

bool vis[maxn];

void dfs(int u,int f)
{
    for(int i=E.head[u];i;i=E.edge[i].nxt)
    {
        int v=E.edge[i].to;
        if(v==f) continue;
        dfs(v,u);
    }
    if(u==1&&vis[u]){printf("-1");exit(0);}
    else if(u==1) return ;
    if(vis[u]) G.add(f,u),ind[u]++;
    else G.add(u,f),ind[f]++,vis[f]^=1;
}
int cnt;
int ans[maxn];
priority_queue<int,vector<int>,greater<int>>que;
void topu()
{
    for(int i=1;i<=n;i++) if(ind[i]==0) que.push(i);
    while(!que.empty())
    {
        int u=que.top();
        que.pop();
        ans[++cnt]=u;
        for(int i=G.head[u];i;i=G.edge[i].nxt)
        {
            int v=G.edge[i].to;
            if(!(--ind[v])) que.push(v);
        }
    }
    for(int i=1;i<=cnt;i++) printf("%d ",ans[i]);
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        E.add(u,v);
        E.add(v,u);
    }
    for(int i=1;i<=n;i++)
    {
        char op;
        cin>>op;
        vis[i]=(op=='B');
    }
    dfs(1,0);
    topu();
}

标签:ARC143E,head,int,Reversi,tot,vis,edge,maxn
From: https://www.cnblogs.com/binbinbjl/p/17993585

相关文章

  • [AGC037E] Reversing and Concatenating 题目解法
    题目链接点击打开链接题目解法很妙的一道题首先考虑最大化开头出现的最小字母(\(c\))的个数可以发现,通过一次操作可以截出后缀为\(c\)的序列,之后的操作每次可以倍长\(c\)的长度如果倍长\(k-1\)次之后的长度仍然\(<n\),那么我们需要考虑在保证上面的条件最优的前提下......
  • PAT_A1015 Reversible Primes
    A reversibleprime inanynumbersystemisaprimewhose"reverse"inthatnumbersystemisalsoaprime.Forexampleinthedecimalsystem73isareversibleprimebecauseitsreverse37isalsoaprime.Nowgivenanytwopositiveintegers N (&......
  • PAT 甲级【1015 Reversible Primes】
    考察素数判断考察进制转换importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.StreamTokenizer;publicclassMain{@SuppressWarnings("uncheck")publicstaticvoidmain(String[]args)throwsIOException{StreamTok......
  • AtCoder Regular Contest 164 F Subtree Reversi
    洛谷传送门AtCoder传送门非常好题目。发现每个点颜色被反转的次数是固定的,为其深度(根结点深度为\(0\))。于是可以看作是,一放棋子就得到分数。那么先手取偶数层和后手取奇数层都会使先手得分,所以双方的目标都是尽可能多取偶数层的结点。考虑若一开始有偶数层的叶子,那么当前的......
  • [AGC031B] Reversi
    题目大意有一个长度为\(n\)的数列\(a\),你需要对其进行\(q\)次操作,操作有两种类型,按如下格式给出:1xy:将\(a_x\)变成\(y\);2lr:询问位置在\(\left[l,r\right]\)之间的不下降子串有多少个。思路考虑DP。考虑第\(i\)个石头,如果第\(i\)个石头不修改,方案数仍......
  • Reversing-x64Elf-100
     对应的脚本代码为: ......
  • 【攻防世界逆向】《getit》《no-strings-attached》《csaw2013reversing2》
    题目getit解法先用exeinfo打开看看文件格式无壳elf文件,放进ida64打开看看,并f5查看伪代码耐心的学习了一下。我先学了下面的文件操作fseek修改原指向stream流指针,按照第p【i】个位置从左开始数fputc把前面内容从上面的指针开始编辑不带格式化fprintf把内容写入流文......
  • 时间可逆的马氏链(Time Reversible Markov Chain)
    逆向过程考虑一个具有转移概率\(P_{ij}\)和平稳概率\(\pi_i\)的已经达到平稳状态的遍历的(不可约+非周期+正常返)马尔科夫链。假设这个马氏链在平稳态的状态序列是\(\{X_m,X_{m+1},\cdots\}\),现在我们沿时间的反方向来看这条链,具体地,我们希望考察\(P(X_m=j|X_{m+1}=i,X_{......
  • AtCoder Regular Contest 109 E 1D Reversi Builder
    洛谷传送门AtCoder传送门考虑固定\(s\)和每个格子的颜色,最终有多少个石子被染黑。结论:任何时刻只有不多于两个极大同色连通块。证明:设\([x,y]\)为当前的黑连通块,\([y+1,z]\)为白连通块。如果下一次染\(x-1\),若\(x-1\)为白,则\([x-1,z]\)都被染为白;否则\(x-1\)被......
  • 题解 ARC111B【Reversible Cards】
    我们将值域中每个数视作一个节点,将每张卡片视作连接两个节点的边,则问题转化为:对于每条边都选择一个端点,使得被选择的节点总数最大。显然每个连通块可以分开处理。设连通块......