【ARC079F】Namori Grundy
Description
题目链接
大意:给一张基环外向树。要求给每一个点确定一个值,其值为所有后继点的\(\text{mex}\)。求是否存在确定权值方案。
Solution
首先,对于叶子节点,其权值必定是0.
对于每一棵外向树,树上的每个点的权值都是唯一确定的。可以通过DFS计算得到。
然而,每棵外向树的根——环上的某个点\(u\),其权值不是唯一确定的。因为它要考虑的后继,不仅包括在树上的后继,还有一个环上后继。
根据\(\text{mex}\)的性质,我们发现不管\(u\)的环上后继是多少,\(u\)始终只有两种取值:分别是只考虑树上后继时的一级\(\text{mex}\)与二级\(\text{mex}\)。
再一来可以发现,只要我们确定了环上的某个点\(u\)的权值,我们可以唯一确定地填出剩余环上点的权值。只需要模拟一圈计算回来,判断最终\(u\)的权值和开始确定的值是否相同即可。
任选一个环上点,两种值各试一次,只要一种OK则存在方案;否则无解。
要对这个\(\text{mex}\)的取值比较敏感,才能很快地发现“两种取值”这一性质。确定一个点的值就能唯一确定方案这一点只要不要脑抽退却了应该能够比较顺利地发现。
Code
#include <cstdio>
using namespace std;
const int N=200005;
int n,pre[N],cnex[N];
int h[N],tot;
struct Edge{
int v,next;
}e[N*2];
int a[N],len,mex[N][2];
inline void addEdge(int u,int v){
e[++tot]=(Edge){v,h[u]}; h[u]=tot;
}
void readData(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&pre[i]);
addEdge(pre[i],i);
}
}
void findCircle(int u){
static int stk[N],top=0;
static bool vis[N];
stk[++top]=u;
vis[u]=true;
if(vis[pre[u]]){
int v=pre[u];
cnex[v]=u;
for(;stk[top]!=v;top--){
cnex[stk[top]]=stk[top-1];
a[++len]=stk[top];
}
a[++len]=v;
return;
}
findCircle(pre[u]);
}
void dfs(int u,int dep){
for(int i=h[u],v;i;i=e[i].next)
if((v=e[i].v)!=cnex[u])
dfs(v,dep+1);
static int cnt[N];
for(int i=h[u],v;i;i=e[i].next)
if((v=e[i].v)!=cnex[u])
cnt[mex[v][0]]++;
for(mex[u][0]=0;cnt[mex[u][0]];mex[u][0]++);
if(dep==0)
for(mex[u][1]=mex[u][0]+1;cnt[mex[u][1]];mex[u][1]++);
for(int i=h[u],v;i;i=e[i].next)
if((v=e[i].v)!=cnex[u])
cnt[mex[v][0]]--;
}
bool run(int x){
int last=x;
for(int i=len-1;i>=1;i--){
int u=a[i];
last=(mex[u][0]==last)?mex[u][1]:mex[u][0];
}
last=(mex[a[len]][0]==last)?mex[a[len]][1]:mex[a[len]][0];
return x==last;
}
bool judge(){
for(int i=1;i<=len;i++)
dfs(a[i],0);
return run(mex[a[len]][0])||run(mex[a[len]][1]);
}
int main(){
readData();
findCircle(1);
puts(judge()?"POSSIBLE":"IMPOSSIBLE");
return 0;
}
【ARC079F】Namori Grundy的更多相关文章
- 【agc004f】Namori Grundy
那个问一下有人可以解释以下这个做法嘛,看不太懂QwQ~ Description 有一个n个点n条边的有向图,点的编号为从1到n. 给出一个数组p,表明有(p1,1),(p2,2),…,(pn,n)这n ...
- 【agc004F】Namori
Portal -->agc004F Solution 好神仙的转化qwq 首先我们可以先考虑\(m=n-1\)的情况下,也就是树的情况下要怎么做 我们可以将这个问题转化一下:我们对这颗 ...
- [Arc079F] Namori Grundy
[Arc079F] Namori Grundy 题目大意: 一个有向弱联通环套树. 一个点的sg值等于出边连向点的sg值的mex. 试问是否有办法给每个点分配sg值? 试题分析 题目大意把一些难点跳过 ...
- 【atcoder F - Namori】**
F- Namori http://agc004.contest.atcoder.jp/tasks/agc004_f Time limit : 2sec / Memory limit : 256MB S ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
随机推荐
- Liunx-cp命令
1. 复制当前目录的test文件夹 到/201904 目录 出现如下截图问题是因为test目录下还有文件,所以得加-r,使用递归拷贝.我现在用这个命令拷贝文件都加-r了,不管有文件还是没文件 2.复制 ...
- WPF编程,通过Path类型制作沿路径运动的动画另一种方法。
原文:WPF编程,通过Path类型制作沿路径运动的动画另一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/d ...
- 编程语法分析之“优先级”和“结合律”
上节<编程语法分析之从表达式说起>中说到表达式,他的主要作用就是返回一个值!那这个值具体是多少,就要看表达式的整个运算过程.要理解表达式的运算过程就必须了解"优先级"和 ...
- Ubuntu16.04上用源代码安装ICE
ubuntu16.04上用源代码安装ICE
- C#_Stream
IO操作基本上需要用到Stream相关的子类,因此这类问题在CSDN问得也是比较多.其实对于Stream来说,操作起来比较简单,只要对细节的处理稍微注意一下,相信在使用它的时候也会得心应手. 对于St ...
- linux下tomcat指定jdk和配置运行参数
一.指定运行jdk 1)set classpath.sh和catalina.sh中写入: export JAVA_HOME=/usr/local/java/jdk1.8.0_121 export JR ...
- 前端常见算法面试题之 - 二维数组中的查找[JavaScript解法]
--------------------- 作者:吴潇雄 来源:CSDN 原文:https://blog.csdn.net/weixin_43439741/article/details/835118 ...
- Istio 流量治理功能原理与实战
一.负载均衡算法原理与实战 负载均衡算法(load balancing algorithm),定义了几种基本的流量分发方式,在Istio中共有4种标准负载均衡算法. •Round_Robin: 轮询算 ...
- PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历
题目就是给出一棵二叉搜索树,已知根节点为0,并且给出一个序列要插入到这课二叉树中,求这棵二叉树层次遍历后的序列. 用结构体建立节点,val表示该节点存储的值,left指向左孩子,right指向右孩子. ...
- 第二阶段团队冲刺——One
个人任务: 司宇航:处理第一次启动服务器500的问题. 季方:优化cookie第一次运行出错的问题. 王金萱:修改注册界面. 马佳慧:修改登录界面. 站立会议: 任务看板和燃尽图: