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的更多相关文章

  1. 【agc004f】Namori Grundy

    那个问一下有人可以解释以下这个做法嘛,看不太懂QwQ~ Description 有一个n个点n条边的有向图,点的编号为从1到n. 给出一个数组p,表明有(p1,1),(p2,2),…,(pn,n)这n ...

  2. 【agc004F】Namori

    Portal -->agc004F Solution  好神仙的转化qwq ​  首先我们可以先考虑\(m=n-1\)的情况下,也就是树的情况下要怎么做  我们可以将这个问题转化一下:我们对这颗 ...

  3. [Arc079F] Namori Grundy

    [Arc079F] Namori Grundy 题目大意: 一个有向弱联通环套树. 一个点的sg值等于出边连向点的sg值的mex. 试问是否有办法给每个点分配sg值? 试题分析 题目大意把一些难点跳过 ...

  4. 【atcoder F - Namori】**

    F- Namori http://agc004.contest.atcoder.jp/tasks/agc004_f Time limit : 2sec / Memory limit : 256MB S ...

  5. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  6. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  7. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  8. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  9. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

随机推荐

  1. Docker:一个装应用的容器

    一:简介:你是否经历过“我本地运行没问题啊!““哪个哥们有写死循环了““完了,服务器撑不住了“等等问题,docker就是这么帮你解决问题的工具,它可以帮你把web应用自动化打包和发布,在服务型环境下进 ...

  2. 2017-2018-2 20155224『网络对抗技术』Exp8:Web基础

    实践具体要求 Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前端javascipt(0.5分) 理 ...

  3. 【php增删改查实例】第五节 - easyUI的基本使用

    1. 列表组件 datagrid 1.1 创建一个grid.html <html> <head> <meta charset="utf-8" /> ...

  4. python 回溯法 子集树模板 系列 —— 5、取物搭配问题

    问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. ...

  5. 手撸orm框架

    一 前言 1 我在实例化一个user对象的时候,可以user=User(name='lqz',password='123') 2 也可以 user=User() user['name']='lqz' ...

  6. spring boot 实现文件下载

    html 代码 js部分 window.location.href= this.Baseurl+'/plan/down?file='+filename; spring boot 后台代码@GetMap ...

  7. Edit Distance问题在两种编程范式下的求解

    本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...

  8. 使用plumbing命令来深入理解git add和git commit的工作原理

    前言: plumbing命令 和 porcelain命令 git中的命令分为plumbing命令和porcelain命令: porcelain命令就是我们常用的git add,git commit等命 ...

  9. 科普贴 | 以太坊代币钱包MyEtherWallet使用教程,一步步教你玩转MEW

    MyEtherWallet 是一个以太坊的网页钱包,使用非常简单,打开网页就可以使用,源代码开源,不会在服务器上存储用户的钱包信息如私钥和密码.支持 Ledger Wallet.TREZOR 等硬件钱 ...

  10. 【机器学习】Apriori算法——原理及代码实现(Python版)

    Apriopri算法 Apriori算法在数据挖掘中应用较为广泛,常用来挖掘属性与结果之间的相关程度.对于这种寻找数据内部关联关系的做法,我们称之为:关联分析或者关联规则学习.而Apriori算法就是 ...