ARC143E Reversi
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 Reversi的更多相关文章
- AtCoder Grand Contest 031 B - Reversi
https://atcoder.jp/contests/agc031/tasks/agc031_b B - Reversi Time Limit: 2 sec / Memory Limit: 1024 ...
- AtCoder Grand Contest 031 B - Reversi(DP)
B - Reversi 题目链接:https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: 给出n个数,然后现在你可以对一段区间修改成相同的值,前提是 ...
- I - 一次元リバーシ / 1D Reversi(水题)
Problem Statement Two foxes Jiro and Saburo are playing a game called 1D Reversi. This game is playe ...
- 2018.09.20 atcoder 1D Reversi(模拟)
传送门 考虑每次摆石头都会消去最外层的一个连续颜色串. 所以只用统计一下有多少段颜色即可. 代码: #include<bits/stdc++.h> using namespace std; ...
- HDU 3368 Reversi (暴力,DFS)
题意:给定一个8*8的棋盘,然后要懂黑白棋,现在是黑棋走了,问你放一个黑子,最多能翻白子多少个. 析:我是这么想的,反正才是8*8的棋盘,那么就暴吧,反正不会超时,把每一个格能暴力的都暴力,无非是上, ...
- HDU 3368 Reversi
http://acm.hdu.edu.cn/showproblem.php?pid=3368 题意:模拟黑白棋,下一步黑手最大可以转化多少个白旗 分析:暴力 原先的思路是找到D然后遍历其八个方向,直到 ...
- Atcoder AGC031B Reversi (DP计数)
简单的计数题.(总算做出一道AGC的B题了,然而这场比赛我忘记打了233333) 题目链接: https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: ...
- [atARC109E]1D Reversi Builder
归纳每一次操作后必然是两个颜色相同的连续段(即ww...bb...或bb...ww...),对操作的位置分类讨论不难证明正确性 当$c_{1}=c_{n}$,由于端点颜色不会修改,再根据该结论,可以得 ...
- 课程设计 --- 黑白棋中的 AI
原文链接:https://www.dreamwings.cn/reversi/3013.html 到了考试周了佯,可是偏偏这个时候迎来了很多很多的课程设计,幸好教授把C语言的课程设计提前发出了,不然都 ...
- 用Dart写的黑白棋游戏
2013年11月,Dart语言1.0稳定版SDK发布,普天同庆.从此,网页编程不再纠结了. 在我看来,Dart语法简直就是C#的升级版,太像了.之所以喜欢Ruby的一个重要理由是支持mixin功能,而 ...
随机推荐
- Ubuntu 更换 macOS Big Sur 主题
我们很多人使用 Mac 的原因之一是 macOS 是最像 Linux 的操作系统(bushi),而 macOS 精美的图形界面又让我们欲罢不能.那么能不能将 macOS 的图形界面搬到 Linux 上 ...
- 【图文教程】Centos 7下安装Hadoop
环境说明: 系统:Centos7 在VM中安装的 hadoop版本:2.7.7 JDK:1.8 注意:Hadoop需要Java环境的.记得安装Java环境 PS:Centos JDK安装 mkdir ...
- vscode 安装历史版本
修改版本号为想要下载的版本即可 https://update.code.visualstudio.com/{版本}/win32-x64-archive/stable vscode 历史版本地址:Vis ...
- Android升 Androidx 语系切换失效
背景: 一个很旧的Android项目,android升androidx 切换语系失败,debug的时候,传的语系值是对的,但是确实没有国际化效果 原因: 经过一番学习,原因是使用 implementa ...
- Coursera, Deep Learning 5, Sequence Models, week4, Transformer Network
self-attention multi-head attention
- FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer
GSYVideoPlayer是一个国产的移动端视频播放器,它采用了IJKPlayer.Media3(EXOPlayer).MediaPlayer.AliPlayer等四种播放器内核,支持弹幕.滤镜. ...
- .NET 多版本 WinForm 开源控件库 SunnyUI
前言 给大家推荐一款开源的 Winform 控件库,可以帮助我们开发更加美观.漂亮的 WinForm 界面. 项目介绍 SunnyUI.NET 是一个基于 .NET Framework 4.0+..N ...
- Angular 18+ 高级教程 – Naming Conversion
前言 命名规范对项目维护是很重要的. Angular 对项目的渗透很大的, 必须做好命名规范, 不然会很乱. InjectionToken InjectionToken = UPPER_SNAKE_C ...
- Email 关于 POP3 IMAP SMTP office365 Outlook Gmail G-Suit shared mailbox小小理解
Outlook 是微软的一个 email 软件, 管理 email 的 UI. Gmail 是 google 的 office365 是一个配套, 里面有 email, one drive, exce ...
- 【赵渝强老师】在MongoDB中使用MapReduce方式计算聚合
MapReduce 能够计算非常复杂的聚合逻辑,非常灵活,但是,MapReduce非常慢,不应该用于实时的数据分析中.MapReduce能够在多台Server上并行执行,每台Server只负责完成一部 ...