长度为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,更新u
			tarjan(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后悔没早点做58同城代运营

什么是58代运营&#xff1f; 58代运营是指由专业的代运营公司或团队来负责58同城等电商平台的商家店铺的运营管理。这种服务模式主要针对缺乏电商运营经验和专业知识的商家&#xff0c;代运营公司或团队通过其专业的团队和丰富的经验&#xff0c;帮助商家实现店铺的高效运营和…

WPF学习(2)

下面是WPF常用的一些布局。 Grid,UniformGrid Grid&#xff1a;网格&#xff0c; UniformGrid&#xff1a;自动创建行列。每个单元格大小相同。一般用于动态绑定数据 代码及运行效果如下&#xff1a; <!--容器控件 网格--><Grid ShowGridLines"True">&…

数据分析-Pandas数据分组箱线图

数据分析-Pandas数据分组箱线图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&#x…

福利:kafka必知必会学习笔记

今天给大家分享两份Kafka学习笔记《kafka必知必会》《kafka基础进阶高级面试汇总》 《kafka必知必会》 为什么有消息系统 ! Kafka基础 ! Kafka 架构 ! Kafka为什么性能⾼ ! Kfaka数据可靠性! 《kafka基础进阶高级面试汇总》 基础篇 1.Kafka 的用途有哪些?使用场景如何…

2-web端管理界面使用rabbitmq

Web管理界面可以直接操作RabbitMQ&#xff0c;下面进行操作并记录步骤 1、添加交换器&#xff1a; Add a new exchange 中&#xff0c;Name是交换器名称&#xff0c;Type是交换器类型&#xff0c;有direce、fanout、heders、topic 4种。 这里先只填Name和选个类型&#xff0c;…

Java 注释的艺术

1、Java 注释的艺术 在 Java 编程中&#xff0c;注释不仅仅是代码的装饰&#xff0c;它们是沟通思想、意图和代码逻辑的桥梁。良好的注释习惯可以极大地提升代码的可读性和可维护性&#xff0c;尤其在团队合作中&#xff0c;这种作用更是不言而喻。今天&#xff0c;我将与大家…

mac 下redis

安装 Redis brew install redis 安装完成后&#xff0c;我们可以使用以下命令来确认 Redis 是否正确安装&#xff1a; redis-cli ping 启动 Redis redis-server 后台启动 Redis&#xff0c;可以使用以下命令&#xff1a; redis-server --daemonize yes 指定配置文件启动…

C#,煎饼排序问题(Pancake Sorting Problem)算法与源代码

1 煎饼排序问题 给定一个未排序的数组&#xff0c;任务是对给定数组进行排序。您只能在阵列上执行以下操作。 翻转&#xff08;arr&#xff0c;i&#xff09;&#xff1a;将数组从0反转为i 示例&#xff1a; 输入&#xff1a;arr[]{23、10、20、11、12、6、7} 输出&#xff1a…

SAP PP学习笔记07 - 简单BOM,派生BOM,多重BOM,批量修改工具 CEWB

上一章讲了BOM的操作。 SAP PP学习笔记06 - BOM操作&#xff08;BOM 展开&#xff0c;BOM 使用先一览&#xff0c;BOM比较&#xff0c;批量更改BOM&#xff09;-CSDN博客 本章延续上一章&#xff0c;继续讲BOM操作。 主要讲 派生BOM&#xff0c;多重BOM&#xff0c;以及BOM批…

2023 最新 IntelliJ IDEA 2023.3 详细配置步骤演示:新入职如何快速配置 IntelliJ IDEA?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

express基础

express express介绍 官网传送门基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架express特点 Web 应用 Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架&#xff0c;它提供一系列强大的特性&#xff0c;帮助你创建各种 Web 和移动设备应用。…

【linux进程信号(二)】信号的保存,处理以及捕捉

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程信号 1. 前言2. 信号阻塞…

设计高并发秒杀系统:保障稳定性与数据一致性

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 系统架构设计 1. 系统架构图 二、 系统流程 三…

Github 2024-03-07 开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4C++项目3C#项目1TypeScript项目1非开发语言项目1HTML项目1CSS项目1屏幕截图转代码应用 创建周期:114 天开发语言:TypeScript, Pyt…

【VTKExamples::PolyData】第五十三期 WeightedTransformFilter

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例WeightedTransformFilter,并解析接口vtkWeightedTransformFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就…

二维码门楼牌管理系统应用场景:助力紧急服务

文章目录 前言一、紧急服务部门的传统挑战二、二维码门楼牌管理系统的优势三、实际应用案例分析四、未来展望 前言 随着城市化的快速发展&#xff0c;传统的门牌管理系统已无法满足现代社会的需求。二维码门楼牌管理系统的出现&#xff0c;为紧急服务部门&#xff08;如警察、…

RabbitMQ 交换器

RabbitMQ 交换器 官方例子 http://www.rabbitmq.com/getstarted.html direct 如上图所示&#xff0c;两个队列绑定到了direct交换器上&#xff0c;第一个队列绑定的 binding key 为 orange &#xff0c;第二个队列有两个绑定&#xff0c;分别是 black 和 green 。 如上图所示…

C#,入门教程(26)——数据的基本概念与使用方法

上一篇&#xff1a; C#&#xff0c;入门教程(25)——注释&#xff08;Comments&#xff09;你会吗&#xff1f;看多图演示&#xff0c;学真正注释。https://blog.csdn.net/beijinghorn/article/details/124681888 本文所述的知识基本上适用于C/C&#xff0c;java等其他语言。 …

脉宽调制PWM控制器有哪些国产替代可选择?

一、脉宽调制PWM简介 PWM的理论基础为面积等效原理&#xff0c;这个原理简单描述就是冲量相等&#xff08;信号对时间的积分&#xff0c;即面积&#xff09;而形状不同的窄脉冲加在具有惯性的环节上时&#xff0c;其效果基本相同。冲量相等而形状不同的窄脉冲加在具有惯性的环…

基于机器学习的垃圾分类

1绪论 1.1问题背景 垃圾分类有减少环境污染、节省土地资源、再生资源的利用、提高民众价值观念等的好处&#xff0c;在倡导绿色生活&#xff0c;注重环境保护的今天&#xff0c;正确的垃圾分类和处理对我们的生态环境显得尤为重要。 在国外很多国家&#xff0c;经过了几十年…