首页 > 其他分享 >Cyclic Operations 题解

Cyclic Operations 题解

时间:2023-12-19 12:24:06浏览次数:31  
标签:Operations 环上 Cyclic int 题解 flag MAXN 操作 题意

前言

看这道题有好多巨佬都是用 Tarjan 来做的,在这里讲一个自认为比较简单的做法,(不到 \(30\) 行)

题意

题意比较难讲,建议自己去看一下翻译,在这里不多赘述。

思路

首先看到题目中间给的一个每一次操作的式子:\(a_{l_{i}}=l_{(i\mod k)+1}\)。仔细观察这个式子后会发现,其实每一次操作的目的其实就是将 \(a_{i}\) 变为 \((i+1)\mod k\)。再看样例的数组从 \(1,2,3\) 变成了 \(2,3,1\),于是我们就联想到了环。所以我们可以从 \(i\) 向 \(a_{i}\) 连一条边,这样就构成了一张图,且图中有若干个环。而每一个环其实就对应着每一次操作,不在环上的点不用考虑,因为随便选一些不在环上的点和一些在环上的点一共凑齐 \(k\) 个点之后按要求进行操作就可以达到目标了。

接下来只需要考虑每一个环是否符合要求就行了。因为题目上说了每一次操作选的数的数量必须刚好是 \(k\) 个,而每一个环上的点又必须一起选,所以我们只需要判断每一个环上的点数是否刚刚好等于 \(k\) 就行了。

注意当 \(k=1\) 的情况时需要特判一下。

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair <int,int> pii;
const int MAXN = 2e5 + 10;
int T,n,k,a[MAXN],num[MAXN],vis[MAXN];
bool flag;
signed main()
{
	cin >> T;
	while(T--)
	{
		flag = true;
		cin >> n >> k;
		for(int i = 1;i <= n;i++) cin >> a[i],flag &= (!(k == 1 && a[i] != i));
		for(int i = 1;i <= n;i++)
		{
			if(vis[i] == true) continue;
			int u = i,cnt = 0;
			while(vis[u] == false) vis[u] = i,num[u] = ++cnt,u = a[u];
			if(vis[u] != i) continue;
			if(cnt - num[u] + 1 != k) flag = false;
		}
		if(flag == false) puts("No");
		else puts("Yes");
		for(int i = 1;i <= n;i++) num[i] = vis[i] = 0;
	}
	return 0;
}

标签:Operations,环上,Cyclic,int,题解,flag,MAXN,操作,题意
From: https://www.cnblogs.com/Creeperl/p/17913432.html

相关文章

  • P4630 [APIO2018] 铁人两项 题解
    今天学习了圆方树,并且做了一道和这道题很像的题,于是就又来做了一下这道题。题意给定一张不保证连通的无向图。求有多少个点对\((a,b,c)\)满足\(a\)到\(c\)的简单路径上经过了点\(b\)。思路显然圆方树。点双缩点过后构造一颗圆方树,然后考虑如何计算答案。圆方树有一个实......
  • [ABC315G] Ai + Bj + Ck = X (1 <= i, j, k <= N) 题解
    原题链接:ABC315G前置知识:扩展欧几里得算法。如果还不会扩欧的话,建议先去做这道题。题意给定\(n,a,b,c,k\)。求有多少个\(x,y,z(x,y,z\len)\)满足\(ax+by+cz=k\)。思路首先看到题目给出的方程式:\(ax+by+cz=k\)。我们会发现很像扩欧板子中的:\(ax+by=k\)。只不过又多了一......
  • [ABC318G] Typical Path Problem 题解
    原题链接:ABC318G显然是圆方树。点双缩点过后建立一颗以点\(c\)为根节点的圆方树,考虑什么情况是合法的。从点\(a\)开始往上跳直到跳到点\(c\),如果中间走过了某一个方点并且这个方点与\(b\)点有直接连边,那么就是合法的;否则不合法。证明:如果路径中所经过的方点和\(b\)点......
  • [ABC318F] Octopus 题解
    前言赛时只做到了E题,赛后才来补的F题,还没做出来,看来还是我太菜了。看了题解过后感觉这道题的思路特别巧妙,于是就来写了这篇题解。题意简述一下题意。有\(n\)个宝藏位置分别在\(a_{i}\),另外有一只章鱼有\(n\)条触手,每条触手的长度为\(b_{i}\)。求有多少个点\(k\)......
  • Two-Colored Dominoes 题解
    前言看了这道题的几篇题解,感觉讲的方法都比较麻烦,这里讲一个感觉比较简单的方法。思路首先判断是否有解。计算一下每一行和每一列的牌的数量,只要有一个是奇数就无解,否则有解。证明显然,偶数一定可以分成两组,在纸上模拟一下也可以得出。其次看如何构造。对于竖着的牌,显然只对每......
  • P3071 [USACO13JAN] Seating G 题解
    题意:维护两个操作,区间推平,求连续\(0\)的个数为\(x\)的最前位置。线段树。因为需要求连续\(0\)的个数,所以维护区间左边连续\(0\)的最大个数,区间右边连续\(0\)的最大个数以及区间连续\(0\)的最大个数。注意修改的时候要看是修改为\(1\)还是修改为\(0\)。查询的时......
  • P2664 树上游戏 题解
    原题链接:P2664。题意:给定一棵树,每个点都有一个颜色\(c_{i}\)。对于每一个点\(i\),求出\(\sum_{j=1}^{n}s(i,j)\)的值。其中\(s(i,j)\)表示点\(i\)到点\(j\)的颜色数量。路径相关,考虑点分治。假设当前的重心为\(u\),那么对\(u\)自己的贡献就是\(u\)到\(u\)的所有......
  • [ABC328F] Good Set Query 题解
    复习了一下边带权并查集板子。设\(d_{x}\)表示当前点到它所在连通块根节点的距离。合并点\(x\)和点\(y\)所在两个连通块时需要更新\(d\)。因为将\(x\)点所在连通块的根节点的父亲节点设为了\(y\)点所在连通块的根节点,所以有\(x\toy\toFind(y)=x\toFind(x)\to......
  • P6370 [COCI2006-2007#6] KAMEN 题解
    原题链接:P6370思路题意不多赘述。首先这道题的\(60\)分暴力很好打,直接按题目中的操作做即可,时间复杂度\(O(nr)\)。考虑优化暴力。我们会发现很多次石头的起始点为同一列的情况,其实每一次下落的轨迹是差不多的。具体来讲应该是第一次下落的轨迹一定包含了后面每一次的轨迹。......
  • P4786 [BalkanOI2018] Election 题解
    题意给定一个长度为\(n\)的字符串\(s\),有\(m\)个询问,每次询问最少需要删掉多少个字符才能使\(l\)到\(r\)组成的字符串当中的每一个前缀和后缀都满足C的数量不小于T的数量。思路因为要满足C的数量不小于T的数量,我们不妨设字符C的位置的值为\(1\),字符S的位......