【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前世今生”,以方便初学者能更 ...
随机推荐
- 复习整理2:juit
@FixMethodOrder(MethodSorters.NAME_ASCENDING)测试回环 https://blog.csdn.net/u014294166/article/details/5 ...
- Luogu P2483 【模板】k短路([SDOI2010]魔法猪学院)
说实话,看到这道题的洛谷评级我傻了(传说中的最高难度) 然后看完题目才确定这真的是一道k短路的裸题. 也就敲了个A*吧,15分钟竟然没有调试一遍过. 欧洲玄学. 看题目,主要是找几条从1走到n的路加起 ...
- 一段程序的分析——C++析构器,何时析构
最近在看小甲鱼的视频,有段程序是这么写的: #include <iostream> #include <string> class Pet { public: Pet(std: ...
- Spring MVC统一异常处理
实际上Spring MVC处理异常有3种方式: (1)一种是在Controller类内部使用@ExceptionHandler使用注解实现异常处理: 可以在Controller内部实现更个性化点异常处 ...
- mysql基础(二)—— 简单sql
查询 select * from company select c.code from company c; select m.bookname from myview m; (myview为视图) ...
- 拥抱函数式编程 I - 基本概念
函数编程与命令性编程 为支持使用纯函数方法解决问题,特此创建了函数编程范例. 函数编程是一种声明性编程形式.相比之下,大多数主流语言,包括面向对象的编程 (OOP) 语言(如 C#.Visual Ba ...
- [转载]windows下PHP + Nginx curl访问本地地址超时卡死问题的解决方案
原因: windows 下 nginx+php环境,不支持并发. 解决方案: 1.在配置nginx vhost时,需要同时运行的网站设置不同的fastcgi_pass的端口号 server { ser ...
- .netCoreMVC添加数据仓储
在上一篇关于CodeFirst从零搭建ASP.NETCore2.0中搭建起了完整.netCoreMVC项目,在这一篇中将实现如何注册service服务和Repository数据仓储到web中实现数据的 ...
- Jq_Js_Js、Jq获取浏览器和屏幕各种高度宽度
$(document).ready(function() {alert($(window).height()); //浏览器当前窗口可视区域高度alert($(document).he ...
- Windows10没有修改hosts文件权限的解决方案(亲测有效)
当遇到有hosts文件不会编辑或者,修改了没办法保存”,以及需要权限等问题如图: 或者这样: 我学了一招,现在教给你: 1.win+R 2.进入hosts的文件所在目录: 3.我们开始如何操作才能不出 ...