[Arc079F] Namori Grundy
[Arc079F] Namori Grundy
题目大意:
一个有向弱联通环套树。
一个点的sg值等于出边连向点的sg值的mex。
试问是否有办法给每个点分配sg值?
试题分析
题目大意把一些难点跳过了??!
既然是sg值,那么考虑只有一个环的情况。
也就是说这个环必须由0、1构成,并且相邻两个不同,所以是二分图染色。。
那么显然奇环不行而偶环可以。
发现基环外向树上的那些树我们可以的sg值我们可以直接搞出来,那么我们现在可以获得环上每一个点的sg值的下界,下面就是进行调整了。
当所有点下界相同时,显然就是上面我们说过的情况。
不同我们就分情况讨论:
- \(a_{i-1}<a_{i}\) 不需要调整
- \(a_{i-1}=a_{i}\)调整为+1
- \(a_{i-1}>a_{i}\)依旧不需要调整。
这个过程能否停住是我们判断的标准。
显然若干次以后一定可以停住。
那么不合法的情况显然只有一种:奇环+下界相同。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
//#include<ctime>
//#include<cmath>
//#include<queue>
using namespace std;
#define LL long long
inline int read(){
int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int INF = 2147483600;
const int MAXN = 400010;
int N; int f[MAXN+1];
bool vis[MAXN+1]; int cir[MAXN+1],sta[MAXN+1];
int topx,top; int Next[MAXN<<1],Node[MAXN<<1],Root[MAXN<<1],cnt;
inline void insert(int u,int v){
Node[++cnt]=v; Next[cnt]=Root[u]; Root[u]=cnt; return;
} bool flag=false;
inline void Get_Cir(int k){
if(flag) return ; cir[++topx]=k; vis[k]=true;
for(LL x=Root[k];x;x=Next[x]){
LL v=Node[x]; if(flag) return ;
if(vis[v]){
for(LL j=topx;j>=1&&cir[j]!=v;j--) sta[++top]=cir[j];
sta[++top]=v; flag=true; return ;
} else Get_Cir(v);
} --topx; vis[k]=0; return ;
}
vector<int> vec[MAXN+1];
inline int Get_slope(int k){
vec[k].push_back(-1);
for(int x=Root[k];x;x=Next[x]){
int v=Node[x]; if(vis[v]) continue;
vec[k].push_back(Get_slope(v));
} sort(vec[k].begin(),vec[k].end()); vec[k].push_back(INF);
for(int i=0;i<vec[k].size();i++){
if(vec[k][i]+1!=vec[k][i+1]){
return vec[k][i]+1;
}
}
}
int col[MAXN+1];
inline bool state(){
for(int i=1;i<=top;i++) if(col[i]!=col[1]) return false;
return true;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
N=read(); int x=N;
for(int i=1;i<=N;i++) f[i]=read(),insert(f[i],i);
for(int i=1;i<=N&&!flag;i++) Get_Cir(i); memset(vis,false,sizeof(vis));
if(!(top&1)){puts("POSSIBLE"); return 0;}
for(int i=1;i<=top;i++) vis[sta[i]]=1;
for(int i=1;i<=top;i++) col[i]=Get_slope(sta[i]);
puts(((top&1)&&state())?"IMPOSSIBLE":"POSSIBLE");
return 0;
}
[Arc079F] Namori Grundy的更多相关文章
- [arc079f] Namori Grundy 分类讨论
Description 给给全有一个NN个点NN条边的有向图,点的的编号从11到NN 给给全的图有NN条边,形如:(p1,1),(p2,2),...,(pN,N)(p1,1),(p2,2),...,( ...
- 【ARC079F】Namori Grundy
Description 题目链接 大意:给一张基环外向树.要求给每一个点确定一个值,其值为所有后继点的\(\text{mex}\).求是否存在确定权值方案. Solution 首先,对于叶子节点,其权 ...
- 【构造】AtCoder Regular Contest 079 F - Namori Grundy
对每个点的取值都取最小的可能值. 那个图最多一个环,非环的点的取值很容易唯一确定. 对于环上的点v,其最小可能取值要么是mex{c1,c2,...,ck}(ci这些是v直接相连的非环点)(mex是). ...
- AT2663 Namori Grundy
题目描述: luogu 题解: 好多细节,比如说每个点有且仅有一条入边. 所以说这个图一定是一个基环外向树. 考虑只是一个环的情况,我们可以发现,当环长为偶数时我们可以$01$交替染色,但环长为奇数时 ...
- 【agc004f】Namori Grundy
那个问一下有人可以解释以下这个做法嘛,看不太懂QwQ~ Description 有一个n个点n条边的有向图,点的编号为从1到n. 给出一个数组p,表明有(p1,1),(p2,2),…,(pn,n)这n ...
- NOIp模拟赛三十一
持续降智 分数:100+0+0=100 C题subtask是假的,根本没有部分分中的情况...还我20分QAQ A:[BZOJ4444]国旗计划 B:[agc006f]blackout C:[arc0 ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- AtCoder瞎做第二弹
ARC 067 F - Yakiniku Restaurants 题意 \(n\) 家饭店,\(m\) 张餐票,第 \(i\) 家和第 \(i+1\) 家饭店之间的距离是 \(A_i\) ,在第 \( ...
- 【AtCoder】ARC079
ARC079题解 C - Cat Snuke and a Voyage #include <bits/stdc++.h> #define fi first #define se secon ...
随机推荐
- Understanding the Space Used by ZFS -- (转)
Understanding the Space Used by ZFS By Brian Leonard on Sep 28, 2010 Until recently, I've been confu ...
- DRM/KMS 基本组件介绍
Each DRM device provides access to manage which monitors and displays are currently used and what fr ...
- Fiddler大师之路系列(一)
江湖传言,Fiddler是捕获客户端与服务器之间的所有HTTP(S) 请求的利器,但是在具体使用过程中,发现使用Fiddler进行抓包时有一部分请求总是没到,多方苦寻之下发现客户端使用WinINET这 ...
- spring 学习之二 AOP编程
AOP概念 AOP, aspect oriented programing,翻译过来就是面向切面编程的意思,那什么叫面向切面编程呢?相对于之前传统的纵向继承方式来对原有功能进行功能扩展, 面向切面编程 ...
- UFLDL 教程学习笔记(二)
课程链接:http://ufldl.stanford.edu/tutorial/supervised/LogisticRegression/ 这一节主要讲的是梯度的概念,在实验部分,比较之前的线性回归 ...
- Linux基础 - tmux
安装 yum install tmux 类似vim当中存在命令行模式以及编辑模式,从编辑模式进入命令行模式需要先按ESC键,在tmux当中进行操作也要先准备好"姿势"再操作,默认情 ...
- 学习shell脚本之前的基础知识
日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目.有的单位 ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Struts DynaActionForm example
The Struts DynaActionForm class is an interesting feature to let you create a form bean dynamically ...
- java算法小例子
作为一个程序员,有时候我觉得自己都不适合,因为自己数学不好,算法不好,脑子不够灵活.而对于算法,感觉就像是数学题,总觉得很难.以前上学,在班里总有几个什么都不好,但唯独数学很厉害,真气人!面对难题时, ...