首页 > 其他分享 >Codeforces Round 897 (Div. 2) D

Codeforces Round 897 (Div. 2) D

时间:2024-04-16 19:46:05浏览次数:19  
标签:897 int 连向 Codeforces 操作 Div mod

链接

不是很难的题目,没做出来但是。
使得\(a_{l_i}=l_{(i\mod k)+1}\)这个操作我第一眼没看明白,读题不够仔细,没看到\(l\)只有k给个数字。导致我开始的时候思路错了一段时间,其实还挺要命的,因为第一次没想到,后面要再想到就有点麻烦了。
这题的特点就是在于这个等式。可以发现,这个其实是一个类似于环的东西,我们每次操作如果是选择了一个我完整的\(l\),那把\(l_i连向l_{(i\mod k)+1}\)就一定会形成一个环,除非是被其他的部分覆盖了。但是最后的操作是一定不会被覆盖的,也就是,我对每个\(a[i]\),把\(i向a[i]\)连接一条边,从上面的操作的式子里面可以发现,这个就是\(l_i连向l_{(i\mod k)+1}\)。所以如果是这样操作得到的图,里面必定含环,而且,这个环的大小一定是k。我们可以发现,每个点只能有一个出边,所以这个图的形态就很明显了。

我这些点其实都是想到了的,但是没有把他们联系起来。没有联系起来的原因其实就是对条件想的不够多。要手玩一会,加深理解就能i昂到。主要就是题目的特性。建图不是什么难想到的,还是很明显的暗示的。

读题要读仔细,适当的手玩有助于解题。记住了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read() {
	char c=getchar();int a=0,b=1;
	for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
	for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;return a*b;
}
int head[200001],tot,a[200001];
struct edge
{
	int next,to;
}e[200001];
inline void add(int i,int j)
{
	e[++tot].next=head[i];
	e[tot].to=j;
	head[i]=tot;
}
int deg[200001],Size[200001],ans=0;
void dfs(int x,int fa)
{
//	cout<<x<<endl;
	for(int i=head[x];i!=0;i=e[i].next)
	{
		int u=e[i].to;
		if(u==fa)continue;
		if(Size[u]!=0||deg[u]==0)continue;
		deg[u]--;
		Size[u]=Size[x]+1;
//		cout<<Size[u]<<endl;
		ans=max(ans,Size[u]);
		dfs(u,x);
	}
}
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int T=read();
	while(T--)
	{
		for(int i=1;i<=tot;i++)head[i]=0;
		tot=0;
		int n=read(),k=read();
		for(int i=1;i<=n;i++)
		{
			a[i]=read();
			add(i,a[i]);
		}
		bool no=0;
		if(k==1)
		{
			for(int i=1;i<=n;i++)
			{
				if(a[i]!=i)
				{
					no=1;break;
				}
				
			}
			if(no)cout<<"No"<<endl;
			else cout<<"Yes"<<endl;
			continue;
		}
		for(int i=1;i<=n;i++)deg[i]=0,Size[i]=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=head[i];j!=0;j=e[j].next)
			{
				int u=e[j].to;
				deg[u]++;
			}
		}
		queue<int> q;
		for(int i=1;i<=n;i++)
			if(deg[i]==0)
				q.push(i);
		while(!q.empty())
		{
			int x=q.front();
			q.pop();
			for(int i=head[x];i!=0;i=e[i].next)
			{
				int u=e[i].to;
				deg[u]--;
				if(deg[u]==0)
					q.push(u);
			}
		}
		for(int i=1;i<=n;i++)
		{
			if(deg[i]==0)continue;
			Size[i]=1;
			ans=0;
			dfs(i,0);
			if(ans!=k)
			{
				no=1;
				break;
			}
		}
		if(no)cout<<"No"<<endl;
		else cout<<"Yes"<<endl;
	}
	return 0;
}

标签:897,int,连向,Codeforces,操作,Div,mod
From: https://www.cnblogs.com/HLZZPawa/p/18139038

相关文章

  • CodeForces 1951G Clacking Balls
    洛谷传送门CF传送门考虑用相邻两个球之间的距离来描述一个状态。设距离序列为\(a_1,a_2,\ldots,a_k\)(忽略\(0\))。考虑鞅与停时定理,设一个状态的势能为\(\sum\limits_{i=1}^kf(a_i)\),一次操作能使得势能期望减少\(1\)。那么:\[1=\frac{1}{n}\sum\limits_{i=1}^k......
  • 2024.4.16 训练1(VP) CodeForces自创MashUP训练赛(rating1200-1400)
    mashup链接:https://codeforces.com/gym/518192A.FriendlyArrays经典位运算,这里有个小trick,就是涉及到逻辑运算符的都把每一位拆开来看看影响根据或运算的性质,对于a数列每个数的某一位来说,如果b数组中某个数在这一位上有1,那么在a数组的每个数的这一位都能保证变为1。而在后面......
  • CodeForces Round #939(Div. 2) 补题记录(A~D)
    ABCD首先考虑:对于\(a\)数组的任意一段区间\([l,r]\),都总有一种办法可以让这些数字全部变成\(0\)。构造:若\([l,r]\)一段区间全部为\(0\),则已经达成条件。否则,将所有\(x\in[l,r]\cap\textbf{N}_+\)的\(a_x\neq0\),都让\([x,x]\)这一段区间取\(\text{mex}\)。......
  • Codeforces 1487F Ones
    考虑令\(l=|n|\),最高位为第\(1\)位,最低位为第\(l\)位。考虑选了一个\(\pm\underbrace{11\cdots11}_{i}\),那么显然会对\(l-i+1\siml\)位都有影响。于是能够知道第\(i\)位只有可能由\(<i\)的位影响。便可以考虑由高位到低位依次考虑,假设到了第\(i\)位。首......
  • TheKingsArmyDiv1
    Topcoder#区间dp考虑\(dp_{l,r,3}\)表示当前考虑区间\([l,r]\),上面一行全部\(H\)的最小代价,下面一行全部\(H\)的最小代价,上下都\(H\)的最小代价转移考虑每次将两段拼起来,或者从现有的拓展一个貌似有贪心做法,不太会喵~~~//Author:xiaruizeconstintN=2e2+10......
  • Educational Codeforces Round 164 (Rated for Div. 2)
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1954本来有机会上大分但是唐了E没调出来呃呃。小号比大号分高了呃呃以后想休闲直接打大号了哈哈A数学。若要将\(n\)个位置全部涂成颜色\(i\),则一定要修改\(n-\operatorname{count}(i)\)......
  • 【官方题解】Codeforces Round 939 (Div. 2)
    CodeforcesRoundAyachiNeneSolutions(div.2)A.Nene'sGameIdea:[user:Otomachi_Una]Solution不难发现如果一个人初始位置\(p\geqa_1\),那么必然会在有限次回合当中被踢出。答案即为\(\min(n,a_1-1)\)。B.NeneandtheCardGameIdea:[user:Otomachi_Una]Hint......
  • [atcode abc349] D - Divide Interval
    解决方法,贪心。importjava.io.*;importjava.math.BigInteger;importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{longL,R;L=rd.nextLong();R=rd.nextLong();PrintWri......
  • Educational Codeforces Round 164 (Rated for Div. 2) D
    因为理解错了题目导致我没错出来。我理解为有两个人取球,每个人每次都是取一组,也就是一组的球必须要放在一个人手里。。因为我之前做的一个背包是这个样子的。这就导致了,我认为每次转移所需要的信息是比实际要的多很多的,直接导致我没法设计一个正常的dp。然后炸了。。。好烦。。......
  • DiviDuelo
    https://codeforces.com/gym/105053/problem/D我发现了p^alpha=N,alpha%2!=0以及pq=N,(p,q为素数)的情况下先手玩家有必胜策略,然而我不知道如何用O(sqrt(N))的算法分解出上面的东西`#include<bits/stdc++.h>usingnamespacestd;std::vectorfactorize(intn){std......