ARC079F - Namori Grundy(构造,基环树)

ARC079F - Namori Grundy

Solution

首先这是一个NNN个点NNN条边的有向图,所以它的基图是一棵基环树,其次这个图的所有点入度为111,因此这是一棵基环外向树。

然后对于aia_iai,假设我们求出S={aj∣(i,j)∈E}S=\{a_j|(i,j)\in E\}S={aj(i,j)E},即iii的所有出边的aaa的集合,那么显然ai=mexSa_i=mex\;Sai=mexSaia_iai的值是可以通过其出边唯一确定的。

我们先考虑一棵树的情况,我们发现叶子结点必然为000,因此每一个结点iiiaia_iai都可以从下到上通过其儿子结点递推得到。

现在考虑基环树,对于环上一点,我们可以通过它的子树唯一确定去掉环时它的aaa,然后可以发现当且仅当环长为奇数且环上结点的aaa都相等时无解

然后直接找到环,递推求出每一个aaa,判一判就行了。

时间复杂度O(n)O(n)O(n)

Proof

现在我们可以把子树点都扔掉,只考虑一个kkk元环。
我们设环上点依次为0,1,2...k−10,1,2...k-10,1,2...k1(i+1,i)∈E(i+1,i)\in E(i+1,i)E,(之后的下标都在模kkk意义下)。

  1. ai+1a_{i+1}ai+1要加111,当且仅当ai+1=aia_{i+1}=a_iai+1=ai
  2. 因为环上点出度为111,一个点最多加111

首先我们不会让所有点都加111,因为这和所有点不变一样,所以若存在方案,一定有一种有至少一个点ppp不动的方案

如果我们知道ppp,那么我们可以从ppp开始判断apa_pap是否等于ap+1a_{p+1}ap+1,若相等则ap+1+1a_{p+1}+1ap+1+1

我们令一段连续的+1+1+1的下标区间为[l+1,r][l+1,r][l+1,r],显然有al=al+1,al+1+1=al+2,al+2+1=al+3...a_{l}=a_{l+1},a_{l+1}+1=a_{l+2},a_{l+2}+1=a_{l+3}...al=al+1,al+1+1=al+2,al+2+1=al+3...,因此这段aaa一定是al,al,al+1,al+2...al+(r−l−1)a_l,a_l,a_l+1,a_l+2...a_l+(r-l-1)al,al,al+1,al+2...al+(rl1),点lll不动且为其中的最小值。

所以我们有结论:若能找到一个iii,使得ai≠ai−1a_i\not = a_{i-1}ai=ai1∀jai≤aj\forall_j a_i\leq a_jjaiajiii可以作为ppp,方案存在。

那么最后还剩下找不到iii的环,其上的点必然是所有aaa相等的,这个就很容易考虑了,因为所有点都等价,所以可以任取一个作为ppp,最后的序列一定长成ap,ap+1,ap,ap+1,ap,ap+1...a_p,a_p+1,a_p,a_p+1,a_p,a_{p}+1...ap,ap+1,ap,ap+1,ap,ap+1...的形式。

这就相当于一个二分图染色,只有当kkk为奇数时,存在相邻两个aaa相等,不合法;当aaa为偶数时存在合法方案。

综上,当且当且仅当环长为奇数且环上结点的aaa都相等时无解。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
vector<int> e[MAXN];
int fa[MAXN],vis[MAXN],instk[MAXN],flag[MAXN],tag[MAXN],f[MAXN],n;
void dfs(int x)
{vis[x]=1,instk[x]=1;for (auto v:e[x]){if (instk[v]) {for (int p=x;p!=v;p=fa[p]) flag[p]=1;flag[v]=1;}else fa[v]=x,dfs(v);}instk[x]=0;
}void tree_dp(int x,int father)
{for (auto v:e[x]) if (v!=father&&!flag[v]) tree_dp(v,x);for (auto v:e[x]) if (v!=father&&!flag[v]) tag[f[v]]=x;for (int i=0;i<n;i++) if (tag[i]!=x) { f[x]=i; return; }
}signed main()
{n=read();for (int i=1,x;i<=n;i++) x=read(),e[x].PB(i);for (int i=1;i<=n;i++) if (!vis[i]) dfs(i);int p=0,num=0;for (int i=1;i<=n;i++) if (flag[i]) tree_dp(i,0),p=f[i],num++;if (!(num&1)) { puts("POSSIBLE"); return 0; } for (int i=1;i<=n;i++)if (flag[i]&&p!=f[i]) { puts("POSSIBLE"); return 0; }puts("IMPOSSIBLE");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #703 (Div. 2) B.Eastern Exhibition 中位数结论

link 题意&#xff1a; 给n个点&#xff0c;求有多少个点到所有点距离之和最小。 中位数结论题了&#xff0c;可以考虑一维的情况&#xff0c;让后二维的话乘起来就好啦。 //#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string&g…

微服务架构下静态数据通用缓存机制

在分布式系统中&#xff0c;特别是最近很火的微服务架构下&#xff0c;有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案&#xff0c;这篇文章将结合一些实际的研发经验&#xff0c;尝试理清其中存在的关键问题以及探寻通用的解决之道。什么是静态数据这里静态…

ARC080F - Prime Flip(贪心,差分,二分图匹配)

ARC080F - Prime Flip Solution 差分&#xff0c;转化为每次可以翻转i,j(j−i∈oddprime)i,j(j-i\in odd\;prime)i,j(j−i∈oddprime)。 显然若j−ij-ij−i是奇质数&#xff0c;则需要111次。 否则若j−ij-ij−i是偶数&#xff0c;则需要222次。 否则若j−ij-ij−i是奇数&am…

Codeforces Round #703 (Div. 2) E. Paired Payment 最短路 + 思维

link 题意&#xff1a; 给一张图&#xff0c;每次只能一下走两个点&#xff0c;比如当前在aaa&#xff0c;往下走到bbb再到ccc&#xff0c;权值为(wa,bwb,c)2(w_{a,b}w_{b,c})^2(wa,b​wb,c​)2。求1到其他点的最短路&#xff0c;不存在输出−1-1−1。 思路&#xff1a; 如果…

ARC077E - guruguru(差分)

ARC077E - guruguru Solution 考虑每一次改动对于每一个xxx的影响。 设我们要从aaa变到bbb。 当a−>x−>ba->x->ba−>x−>b时&#xff0c;该次对xxx的贡献为Da,b−Da,x1D_{a,b}-D_{a,x}1Da,b​−Da,x​1&#xff0c;即一个公差为−1-1−1的递减序列&#…

Codeforces Round #700 (Div. 2) C. Searching Local Minimum 交互二分

传送门 题意: 给一个数组&#xff0c;让你找到a[i]<min(a[i1],a[i−1])a[i]<min(a[i1],a[i-1])a[i]<min(a[i1],a[i−1])位置iii&#xff0c;每次询问iii可以得到a[i]a[i]a[i]&#xff0c;最多询问100次&#xff0c;且a[0]a[n1]∞a[0]a[n1]∞a[0]a[n1]∞。 我们考虑假…

WCF服务端的.NET Core支持项目Core WCF 正式启动

长期以来在wcf客户端库https://github.com/dotnet/wcf里反应最强烈的就是.NET Core的服务端支持https://github.com/dotnet/wcf/issues/2695&#xff0c;在build 2019大会上微软明确说明在将WinForms&#xff0c;WPF和Entity Framework 6添加到.NET Core 3.0后&#xff0c;不打…

LG P3233 [HNOI2014]世界树(虚树,树形dp)

LG P3233 [HNOI2014]世界树 Solution 看完题意&#xff0c;显然是虚树。 建出虚树后&#xff0c;可以容易地求出虚树上的点会被哪一个点管辖&#xff0c;关键在于不在虚树上的点归属于哪个点&#xff0c;我们分类讨论不在虚树上的点的贡献&#xff1a; 我们先假设虚树上的点…

Codeforces Round #700 (Div. 2) D1 D2. Painting the Array 思维

link 题意&#xff1a; 给一个数组&#xff0c;让你从头开始选出一些数放在AAA数组中&#xff0c;剩下的放在BBB数组中&#xff0c;且是有序选择&#xff0c;让后把两个数组中相邻且相等的元素合并。 D1&#xff1a; 使合并后Len(A)Len(B)Len(A)Len(B)Len(A)Len(B)最大。 D2&a…

阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性

设备自身 CPU 温度、电源输入电压、内存使用率等&#xff0c;以及接入到设备的传感器如温度传感器、光敏传感器等&#xff0c;这些硬件的数据输出即是 属性 。设备将这些硬件的数据上传到阿里云物联网平台&#xff0c;实时显示这些设备的状态和实测数据&#xff0c;这个过程是 …

Codeforces Round #694 (Div. 2) D. Strange Definition 质因子分解 + 平方数

传送门 题意&#xff1a; 定义相邻数为lcm(x,y)gcd(x,y)\frac{lcm(x,y)}{gcd(x,y)}gcd(x,y)lcm(x,y)​是一个平方数&#xff0c;则xxx和yyy是相邻的。现在给出q个询问&#xff0c;每次询问一个iii&#xff0c;表示询问第iii秒后max1<i<ndimax_{1<i<n}d_imax1<i…

ARC086E - Smuggling Marbles(虚树,树形dp)

ARC086E - Smuggling Marbles Solution 感觉这题和LG P3233 [HNOI2014]世界树几乎一模一样啊&#xff1f;&#xff01; 大概就是对于每一个深度分别计算贡献&#xff0c;对该深度的点建出虚树&#xff0c;然后树形dpdpdp。 令fxf_xfx​表示xxx子树中2szx2^{sz_x}2szx​种方…

Docker最全教程之MySQL容器化 (二十五)

前言 MySQL是目前最流行的开源的关系型数据库&#xff0c;MySQL的容器化之前有朋友投稿并且写过此块&#xff0c;本篇仅从笔者角度进行总结和编写。目录 镜像说明 运行MySQL容器镜像 1.运行MySQL容器 2.修改“root”账户的认证模式和密码 管理MySQL 1. MySQL命…

CF639F Bear and Chemistry(虚树,边双)

CF639F Bear and Chemistry Solution 显然题目的条件就是所有点在一个边双连通分量内。 所以我们先缩边双求出边双树。 然后对于每一个询问&#xff0c;对询问的点和边的端点建虚树&#xff0c;然后把询问的边连上跑tarjantarjantarjan求边双判断是否所有询问点在同一个边双…

Codeforces Round #694 (Div. 2) E. Strange Shuffle 交互 + 思维分块

link 题意&#xff1a; nnn个人围成一圈&#xff0c;一开始每个人都有kkk张卡片&#xff0c;每回合n−1n-1n−1个人会给左边⌊x2⌋\left \lfloor \frac{x}{2} \right \rfloor⌊2x​⌋&#xff0c;给右边⌈x2⌉\left \lceil \frac{x}{2} \right \rceil⌈2x​⌉&#xff0c;剩下…

Ocelot(五)- 流量限制、服务质量

作者&#xff1a;markjiang7m2原文地址&#xff1a;https://www.cnblogs.com/markjiang7m2/p/10965300.html源码地址&#xff1a;https://gitee.com/Sevenm2/OcelotDemo本文是我关于Ocelot系列文章的第五篇&#xff0c;流量限制、服务质量。Ocelot允许针对具体的服务接口进行流…

java中静态修饰符(static)的使用

static-静态 修饰属性 静态属性,也称为静态变量 类变量等 static 数据类型 属性名; 使用 静态内容独立存放在方法区 静态内容在内存中只有一份,被该类所有对象共享 普通属性所有对象在对象内容中都有一份 可以通过类名.静态属性名的方式直接访问静态属性 静态属性封装之…

ARC082F - Sandglass(思维)

ARC082 D - Sandglass Solution 这题睡觉的时候 想了挺久的。 一段时间Δt\Delta tΔt内要么是让xΔtx\Delta txΔt对XXX取minminmin&#xff0c;要么是让x−Δtx-\Delta tx−Δt对000取maxmaxmax。 如果没有对边界取max/minmax/minmax/min&#xff0c;就是一个单纯的前缀和…

Educational Codeforces Round 101 (Rated for Div. 2) D. Ceil Divisions 思维 + 根号数

传送门 题意&#xff1a; 给一个数组aiia_iiai​i&#xff0c;每次可以进行操作ax⌈axay⌉a_x\left \lceil \frac{a_x}{a_y} \right \rceilax​⌈ay​ax​​⌉&#xff0c;操作不能超过n5n5n5次&#xff0c;最终需要把数组中的数变成n−1n-1n−1个111和一个222。 思路&#x…

Ocelot(三)- 服务发现

作者&#xff1a;markjiang7m2原文地址&#xff1a;https://www.cnblogs.com/markjiang7m2/p/10907856.html源码地址&#xff1a;https://gitee.com/Sevenm2/OcelotDemo本文是我关于Ocelot系列文章的第三篇&#xff0c;主要是给大家介绍Ocelot的另一功能。与其说是给大家介绍&a…