长度为n的数组a初始值全为0,目标是把数组a变为数组b(1<=bi<=n), 可以进行任意次操作:选择长度为k的数组c,(1<=ci<=n且两两不同)

对于1<=i<=k, 把 a[c[i]] 改为c[i % k + 1]。给定n,k和数组b,判断能否得到数组b。

题目

思路:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
#define lson p << 1
#define rson p << 1 | 1
const int maxn = 1e6 + 5, inf = 1e18, maxm = 4e4 + 5;
const int mod = 1e9 + 7;
// const int mod = 998244353;
const int N = 1e6;
// int a[505][5005];
// bool vis[505][505];
// char s[505][505];
int a[maxn], b[maxn];
bool vis[maxn];
string s;
int n, m;struct Node{int val, id;bool operator<(const Node &u)const{return val < u.val;}// int x, y;// int l, r, j;
}c[maxn];int ans[maxn];vector<int> G[maxn], g[maxn];
int dfn[maxn], low[maxn], in_st[maxn];
int col[maxn], cnt_col, tot;
int sum[maxn], siz[maxn];
stack<int> st;void tarjan(int u){dfn[u] = ++tot;low[u] = dfn[u];in_st[u] = 1;st.push(u);for(auto v : G[u]){if(!dfn[v]){//v没遍历过,先更新v,更新utarjan(v);low[u] = min(low[u], low[v]);}else{if(in_st[v]) //后向边或者横向边,就更新low[u] = min(low[u], dfn[v]);}}if(low[u] == dfn[u]){//找到该强连通分量的最先访问到的点col[u] = ++cnt_col;//把该分量的点都标记为同一颜色sum[cnt_col] += a[u];siz[cnt_col]++;while(!st.empty() && st.top() != u){int x = st.top();st.pop();in_st[x] = 0;col[x] = cnt_col;sum[cnt_col] += a[x];siz[cnt_col]++;}if(!st.empty()){st.pop();in_st[u] = 0;}}
}void solve(){int res = 0;int q, k;cin >> n >> k;tot = 0;cnt_col = 0;for(int i = 1; i <= n; i++){G[i].clear();g[i].clear();siz[i] = 0;in_st[i] = 0;dfn[i] = low[i] = 0;}while(!st.empty()){st.pop();}for(int i = 1; i <= n; i++){cin >> a[i];G[i].pb(a[i]);}if(k == 1){for(int i = 1; i <= n; i++){if(a[i] != i){cout << "No\n";return;}}cout << "Yes\n";return;}for(int i = 1; i <= n; i++){if(a[i] == i){cout << "No\n";//不能自环return;}if(!dfn[i]){tarjan(i);}}for(int i = 1; i <= cnt_col; i++){if(siz[i] > 1 && siz[i] != k){cout << "No\n";return;}}cout << "Yes\n";}signed main(){ios::sync_with_stdio(0);cin.tie(0);int T = 1;cin >> T;while (T--){solve();}return 0;
}

法二:

#include <bits/stdc++.h>using i64 = long long;void solve() {int n, k;std::cin >> n >> k;std::vector<int> b(n);for (int i = 0; i < n; i++) {std::cin >> b[i];b[i]--;}if (k == 1) {for (int i = 0; i < n; i++) {if (b[i] != i) {std::cout << "NO\n";return;}}std::cout << "YES\n";return;}std::vector<int> vis(n, -1);for (int i = 0; i < n; i++) {int j = i;while (vis[j] == -1) {vis[j] = i;j = b[j];}if (vis[j] == i) {int len = 0;int x = j;do {len++;x = b[x];} while (x != j);if (len != k) {std::cout << "NO\n";return;}}}std::cout << "YES\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}

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

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

相关文章

Angular入门指南

Angular 是 Google 开发的一款用于构建单页面应用程序 (SPA) 的 JavaScript 框架。它基于 TypeScript 语言&#xff0c;并提供了许多强大的功能&#xff0c;例如&#xff1a; 模块化开发数据绑定路由依赖注入 Angular 已成为构建 SPA 最流行的框架之一。它被许多知名公司使用…

js判断对象是否存在某个键值

方法一 in 操作符 使用方法&#xff1a;‘XXX’ in obj(对象)&#xff0c;结果返回布尔值 true / false const obj { name:张三, sex:男 }name in obj // true test in obj // false 方法二 hasOwnProperty方法 使用方法&#xff1a;obj.hasOwnProperty(XXX)&#xff0c;…

消息服务--Kafka的简介和使用

消息服务--Kafka的简介和使用 前言异步解耦削峰缓存1、消息队列2、kafka工作原理3、springBoot KafKa整合3.1 添加插件3.2 kafKa的自动配置类3.21 配置kafka地址3.22 如果需要发送对象配置kafka值的序列化器3.3 测试发送消息3.31 在发送测试消息的时候由于是开发环境中会遇到的…

STM32按键控制LED蜂鸣器光敏联动

GPIO输入模式下的硬件和电路 以下为不同类型传感器电路图 硬件电路讲解 上面两种接线方式表示按键按下时是低电平&#xff0c;下面两种接线方式表示按键按下时引脚是高电平默认使用上面两种方式比较多。 C语言知识回顾 不同的数据类型 &#xff1a; char short int long longl…

Linux(Ubuntu)中安装vscode

①首先去vscode的官网下载.deb文件 网址&#xff1a;https://code.visualstudio.com/docs/?dvlinuxarm64_deb 注&#xff1a;如果linux端无法打开网页下载文件&#xff0c;可以在Windows端下载好用WinSCP传输到Linux。下载前注意下你的系统架构是arm还是amd&#xff0c;系统…

【LeetCode】整数转罗马数字 C语言 | 此刻,已成艺术(bushi)

Problem: 12. 整数转罗马数字 文章目录 思路解题方法复杂度Code 思路 暴力破解 转换 解题方法 由思路可知 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code char* intToRoman(int num) {char *s (char*)malloc(sizeof(char)*4000), *p s;while(…

C++——类和对象(4):取地址及const取地址操作符重载、初始化列表

2.5 取地址及const取地址操作符重载 2.5.1 const成员 在介绍取地址和const取地址操作符重载前&#xff0c;需要先介绍一下const成员作为基础。在C中&#xff0c;我们将使用const修饰的成员函数称为const成员函数。const看似修饰成员函数&#xff0c;实际则是对成员函数隐含的t…

AHU 数据库 实验五

【实验名称】 实验5 数据库的数据更新与视图管理 【实验目的】 1. 熟悉数据更新操作的概念与操作类型&#xff1b; 2. 熟练掌握INSERT、UPDATE、DELETE语句的基本语法&#xff1b; 3. 熟练运用INSERT、UPDATE、DELETE语句实现数据的插入、修改与删除…

Docker一键部署WordPress

使用Docker安装WordPress相对传统安装方式更加便捷高效&#xff0c;因为它可以快速创建一个包含所有必要组件&#xff08;Web服务器、PHP和MySQL数据库&#xff09;的独立容器环境。下面是一个简化的步骤说明如何使用Docker和Docker Compose安装WordPress&#xff1a; 一 安装…

JavaScript 立即调用函式 IIFE (Immediately Invoked Function Expression) 是什么?优缺点是什么?

立即调用函式 IIFE (Immediately Invoked Function Expression) 是什么? JavaScript 中的立即调用函式 (IIFE,Immediately Invoked Function Expression),指的是一种在定义时立即执行的匿名函式,通常用于创建一个局部作用域,避免全局污染。 语法格式如下: (function (…

CentOS/Fedora/Ubuntu/Debian 系统 wget 命令

wget 是云服务器安装环境和面板常用下载命令。下载软件或从远程服务器下载备份到本地服务器&#xff0c;也可以使用 wget 把文件下载到云服务器上。 VPS wget 命令最常用使用方法如下&#xff1a; 安装 wget 一般来说 wget 命令是系统自带的&#xff0c;方面安装环境和面板&…

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测 目录 多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 …

族群争霸休闲养成小游戏

​游戏概述&#xff1a; 在一个由自然力量支配的幻想世界中&#xff0c;狼族与羊族的战争永无止境。 人族在两者之间寻求和平&#xff0c;建立起坚固的城墙&#xff0c;同时捕捉狼与羊来增强自身实力。 神族则在幕后观察&#xff0c;偶尔以神技介入战场&#xff0c;影响战局…

保障数据安全,提升性能:探秘Redis AOF持久化机制在在线购物网站的应用

AOF&#xff08;Append-Only File&#xff09;日志介绍 Redis使用AOF持久化来保证数据的可靠性。AOF日志是一个追加写文件&#xff0c;记录了所有对Redis数据进行修改的命令。 AOF的常规用途 通常&#xff0c;人们将Redis的AOF用于将后端数据库中的数据存储在内存中&#xf…

复盘-word

word-大学生网络创业交流会 设置段落&#xff0c;段后行距才有分 word-选中左边几行字进行操作 按住alt键进行选中 word复制excel随excel改变&#xff08;选择性粘贴&#xff09; 页边距为普通页边距定义 ##### word 在内容控件里面填文字&#xff08;调属性&#xff09…

JavaScript使用

文章目录 一、JavaScript简介二、JavaScript引入方式1、内部脚本2、外部脚本 三、JavaScript基础语法1、书写语法&输出语句2、变量&数据类型3、运算符4、流程控制语句&函数 四、JavaScript对象1、Array2、String3、自定义对象 五、BOM1、Window2、History3、Locati…

扩展CArray类,增加Contain函数

CArray不包含查找类的函数&#xff0c;使用不便。考虑扩展CArray类&#xff0c;增加Contain函数&#xff0c;通过回调函数暴露数组元素的比较方法&#xff0c;由外部定义。该方法相对重载数组元素的“”符号更加灵活&#xff0c;可以根据需要配置不同的回调函数进行比较 //类型…

C语言————字符函数与字符串函数

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数&#xff0c;如追加&#xff0c;拷贝&#xff0c;替换等等接下来我们就学习⼀下这些函数&#xff0c;并且自实现。 gets 这个指令大家…

十七、enumerate函数的用法

enumerate() 函数是 Python 内置函数之一&#xff0c;用于同时返回可迭代对象的索引和对应的值。 它的语法结构如下&#xff1a; enumerate(iterable, start0) iterable: 表示一个可迭代的对象&#xff0c;如列表、元组、字符串等。start: 可选参数&#xff0c;表示索引起始…

node mysql 同时向两张表插入数据

方法一 在Node.js中使用MySQL模块&#xff0c;如果需要同时向两张关联的表插入数据,通常不会通过一条SQL语句来完成&#xff0c;因为MySQL本身不支持一次插入操作跨多个表。但是&#xff0c;可以采用事务&#xff08;Transaction&#xff09;的方式来保证两个插入操作的原子性…