【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前世今生”,以方便初学者能更 ...
随机推荐
- VB CompactDatabase 压缩/修复数据库
Option Explicit Private Sub Command1_Click() On Error GoTo err Dim DbEngine, dbFile As String dbFile ...
- 20155213免考项目——简易的HIDAttack
20155213免考项目--简易的HIDAttack 听5214说他做不出来自己的免考项目,于是就转向bof进阶,并且成功做出了64位的ROP攻击...... 既然如此,那我就再做一个吧,但都已经期末 ...
- Luogu T24242 购物券Ⅰ(数据已加强)
这是一道比赛时的题目,但由于我没报名,所以浪费了一个大好的切水题的机会. 是经典的meet in middle(折半搜索)的模板题,但是之前一直没找到这种题目,今天终于看到了. 由于m的范围极大,因此 ...
- POJ 2299
上课讲了下数据结构,因为暂时没找到分块的板子题,所以做一下这道题加深一下对树状数组的理解. 题意就是求逆序对,从逆序对的定义就可以看出,方法有两种:归并 or 树状数组. 感觉树状数组更高级一点,写起 ...
- flaskr 报错及其修改
作者:hhh5460 官网有一个flaskr的例子,按照其8个步骤(包括测试),一步一步照着做,有3个地方报错. 究其原因,可能是flaskr这个例子年代比较久远,而现在python以及flask都有 ...
- 表单设置 disabled 后无法传值到后台的解决办法
在提交 from 表单时,下面的 input 无法正常提交给后台, 发现,如果input的字段设为disabled,该表单是无法提交的. <input type="text" ...
- [BZOJ4722]由乃[鸽巢原理+bitset+倍增]
题意 给定长为 \(n\) 序列 \(a\) ,要求支持两种操作: \(1.\) 询问在一个区间 \([l,r]\) 中,是否能够选出两个交集为空的集合 $ \rm X ,Y$, 使得 \(\sum_ ...
- ASP.NET Core分布式项目实战-目录
前言 今年是2018年,发现已经有4年没有写博客了,在这4年的时光里,接触了很多的.NET技术,自己的技术也得到很大的进步.在这段时光里面很感谢张队长以及其他开发者一直对.NET Core开源社区做出 ...
- stl源码剖析 详细学习笔记 hashtable
//---------------------------15/03/24---------------------------- //hashtable { /* 概述: sgi采用的是开链法完成h ...
- tomcat-内存溢出java.lang.OutOfMemoryErrory:PermGen space解决方法
如果是PermGen space方法区内存溢出,可尝试加大MaxPermSize,如果是heap space 堆内存移除,可尝试修改Xmx 正常解决方法: 在注释下的第一行添加: JAVA_OPTS= ...