首页 > 其他分享 >「解题报告」[ARC143E] Reversi

「解题报告」[ARC143E] Reversi

时间:2023-01-17 17:11:06浏览次数:43  
标签:ARC143E pre int Reversi back 先选 解题 MAXN col

挺弱智的题 但是我不会

首先从一个叶子开始考虑,如果这个叶子是白的那么就应该先选它,否则就应该先选它父亲。

然后这样我们可以递归着对子树进行计算,一些子树需要先选,一些子树需要后选,直接 DP 一下就能知道哪些点先选哪些点后选了。

然后我们从先选的向后选的连一条边,那么一个合法方案就是对这个 DAG 进行拓扑排序的过程,直接贪心的跑拓扑排序即可。

树上与它相邻的点有关系的题从叶子开始考虑,因为叶子只有一个相邻的点。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
int n;
vector<int> e[MAXN];
int deg[MAXN];
vector<int> e2[MAXN];
int col[MAXN];
char s[MAXN];
void dfs(int u, int pre) {
    for (int v : e[u]) if (v != pre) {
        dfs(v, u);
        col[u] ^= col[v];
    }
    if (u != 1) {
        if (col[u]) {
            e2[u].push_back(pre);
            deg[pre]++;
        } else {
            e2[pre].push_back(u);
            deg[u]++;
        }
    }
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i < n; i++) {
        int u, v; scanf("%d%d", &u, &v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    scanf("%s", s + 1);
    for (int i = 1; i <= n; i++) {
        col[i] = s[i] == 'W';
    }
    dfs(1, 0);
    if (!col[1]) {
        printf("-1\n");
        return 0;
    }
    priority_queue<int, vector<int>, greater<int>> q;
    for (int i = 1; i <= n; i++) {
        if (!deg[i]) {
            q.push(i);
        }
    }
    while (!q.empty()) {
        int u = q.top(); q.pop();
        for (int v : e2[u]) {
            deg[v]--;
            if (!deg[v]) q.push(v);
        }
        printf("%d ", u);
    }
    printf("\n");
    return 0;
}

标签:ARC143E,pre,int,Reversi,back,先选,解题,MAXN,col
From: https://www.cnblogs.com/apjifengc/p/17058298.html

相关文章

  • AtCoder Beginner Contest 285 解题报告
    AtCoderBeginnerContest285解题报告\(\text{DaiRuiChen007}\)ContestLinkA.EdgeChecker2假设\(a\geb\),当且仅当\(\left\lfloor\dfraca2\right\rfloor=b\)......
  • Vulnhub之Dobby详细解题过程(不同的获得wordpress后台密码方法)
    Dobby作者:jason_huawen靶机信息名称:Hogwarts:Dobby地址:识别目标主机IP地址─(kali㉿kali)-[~/Vulnhub/Dobby]└─$sudonetdiscover-ieth1-r192.168.56.0/2......
  • Codeforces Round #843 (Div. 2)解题报告
    第一篇文章\ovo/AProblem:把只含有ab的字符串分成三份,使中间的字符串字典序是并列最大或最小,求一种方案Solution:假设前两个字符相同,让前两个字符串长度均为1,这两个字符......
  • P4503 [CTSC2014] 企鹅 QQ 解题报告
    Desciptoin小Q是PenguinQQ网站的管理员,他最近在进行一项有趣的研究——哪些账户是同一个人注册的。经过长时间的分析,小Q发现同一个人注册的账户名称总是很相似的,例如P......
  • 网络流二十四题解题报告
    网络流二十四题解题报告\(\text{ByDaiRuiChen007}\)来源:LOJ-网络流24题机器人路径规划问题数据有误,不计入解题报告中1.飞行员配对方案问题ProblemLink构造二......
  • P8935 [JRKSJ R7] 茎 解题报告
    Description你有一棵$n$个点的根节点为$1$的有根树,现在你要对这棵树进行剪枝,每次你可以选择一个还未被剪掉的节点$u$进行操作,然后剪掉$u$的子树所有点(包括$u$)。......
  • P8934 [JRKSJ R7] TSM eerT 解题报告
    Description对于一个$n$个结点的带边权的树$T$,定义$dis(x,y)$为$T$中$x\toy$路径上的边权和。再定义一个$n$个结点的无向完全图$p(T)=G$,其中$\forallx,y\in......
  • P6216 回文匹配 解题报告
    Description对于一对字符串$(s_1,s_2)$,若$s_1$的长度为奇数的子串$(l,r)$满足$(l,r)$是回文的,那么$s_1$的“分数”会增加$s_2$在$(l,r)$中出现的次数。现在......
  • CF808G Anthem of Berland 解题报告
    Description给定$s$串和$t$串,其中$s$串包含小写字母和问号,$t$串只包含小写字母。假设共有$k$个问号。你需要给把每个问号变成一个小写字母,共有$26^k$种可能......
  • 「解题报告」CF1442D Sum
    首先可以发现,如果我们选了两堆且两堆均没选完,那么如果我们将较小的一个改成选较大的一个的下一个,这样一直选一定是更优的,最后肯定会使一些堆全部选完,一些堆没选,一个堆选了......