K. 复合函数 (基环树)

news/2024/4/25 23:04:59/文章来源:https://blog.csdn.net/QQ2530063577/article/details/127254303

2022 CCPC Henan Provincial Collegiate Programming Contest

Problem

在这里插入图片描述

Solution

在这里插入图片描述
在这里插入图片描述

实现思路

  1. 首先可以发现, 从所有的点出发,最终都会进入一个环中。所以可以构建一个 “基环森林”。
  2. 把当前的这个联通块找出来,并单独存起来
  3. 然后bfs拓扑排序把不在环上的点标记,剩下的就是环上的结点
  4. 枚举环上的结点,搜索每一个以环上结点为根节点的子树
  5. 统计大小相同的环上,不同深度的结点个数
  6. 求一下前缀和,求出深度不超过d的结点有多少个
  7. 然后枚举可以整除 ∣a−b∣|a - b|ab 的环长,把深度小于 min(a,b)min(a, b)min(a,b) 的结点累加到答案里面即可
  8. 最后注意:环长最多有 n\sqrt nn 种,有点不太准确,容易 Runtime Error
    准确的是:环长有 2n2 \sqrt n2n
    1+2+3+...+k=k(k+1)/2≤n1 + 2 + 3 + ... + k = k(k + 1) / 2 \leq n1+2+3+...+k=k(k+1)/2nk≤2nk \leq 2 \sqrt nk2n

Code

const int N = 1e5 + 5;
int a[N];
int vis[N], deg[N];
vector<int> v[N], node;
int hoop[500][N];unordered_map<int, int> mp;
int c[N], t;//第i中环长的长度,环长的种类数
int solve(int len)//离散化环的长度
{if (mp.count(len) == 0) c[++t] = len, mp[len] = t;return mp[len];
}void dfs(int x)
{vis[x] = 1;for (int y : v[x]){if (vis[y]) continue;node.push_back(y);dfs(y);}
}void dfs2(int x, int deep, int len) //以环上结点为根,搜索其子树
{for (int y : v[x]){if (vis[y]) continue;vis[y] = 2;//防止非环上结点与环上结点矛盾,使用 2 代表遍历过的非环结点hoop[solve(len)][deep + 1]++;dfs2(y, deep + 1, len);}
}void bfs()
{queue<int> q;for (int x : node)if (deg[x] == 1) q.push(x);int len = sz(node);//环长while (sz(q)){int x = q.front(); q.pop();vis[x] = 0;//0为非环结点, 1 为环上结点len--;for (int y : v[x])if (--deg[y] == 1) q.push(y);}for (int x : node)if (vis[x] == 1){hoop[solve(len)][0]++;dfs2(x, 0, len);}
}int main()
{IOS;int n; cin >> n;for (int i = 1, x; i <= n; i++){cin >> x;v[i].push_back(x);v[x].push_back(i);deg[x]++; deg[i]++;}for(int i = 1; i <= n; i++)if (vis[i] == 0){node.clear();node.push_back(i);dfs(i);bfs();} for (int i = 1; i <= t; i++)for (int j = 1; j < N; j++)hoop[i][j] += hoop[i][j - 1];int q; cin >> q;while (q--){ll x, y; cin >> x >> y;if (x == y) cout << n << endl;else{if (x > y) swap(x, y);int ans = 0;for (int i = 1; i <= t; i++)if ((y - x) % c[i] == 0)if (x < N) ans += hoop[i][x];else ans += hoop[i][N - 1];cout << ans << endl;}}return 0;
}

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

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

相关文章

cocos入门3:脚本编程

简介 Cocos Creator的脚本主要是通过扩展组件来进行开发的。目前CocosCreator支持JavaScript和TypeScript两种脚本语言。通过编写脚本组件&#xff0c;并将它赋予到场景节点中来驱动场景中的物体。 在组件脚本的编写过程中&#xff0c;你可以通过声明属性&#xff0c;将脚本中…

机器人C++库(10)Robotics Library 之碰撞检测算法

机器人C库&#xff08;10&#xff09;Robotics Library 之碰撞检测算法 1.碰撞检测开源库介绍 RL库中集成了以下开源含碰撞检测功能的库&#xff1a; 1.bullet3&#xff1a;https://pybullet.org/wordpress/ 2.FCL&#xff1a;https://github.com/flexible-collision-librar…

【漏洞复现-weblogic-文件上传】vulfocus/weblogic-cve_2018_2894

目录 一、靶场环境 1.1、平台&#xff1a; 1.2、知识: 1.3、描述&#xff1a; 二、漏洞验证 2.1、分析&#xff1a; 2.4、解题&#xff1a; 一、靶场环境 1.1、平台&#xff1a; Vulfocus 漏洞威胁分析平台 123.58.224.8:43200 访问http://ip:port/console后跳转到登陆页…

java基于微信小程序的社区疫情防疫系统 uniapp小程序

用户往往因为不能及时了解到疫情的最新进展而造成许多担忧。另一方面&#xff0c;疫情信息没能进行系统的管理与维护使用户没能在系统里及时的获取到信息。而传统的疫情防控系统&#xff0c;采用的还是人工管理、手工备案、人工查询的方式。但是随之用户人数的增多这种管理方式…

Exchange Online 发送邮件

项目背景 2022年10月4日 微软更改了Exchange的验证方式,原来exchangelib的库没法继续实现邮件的发送。 实现方式 利用Microsoft Graph API 里 发送邮件 - Microsoft Graph v1.0 | Microsoft LearnPOST https://graph.microsoft.com/v1.0/me/sendMail Content-type: text/plai…

【路径规划】基于matlab遗传算法求解仓库拣货距离最短优化问题【含Matlab源码 2154期】

一、物流配送中心拣货作业简介 1 物流配送中心拣货作业 1.1 问题描述 双区型仓库一般是由一定数量的等长巷道组成&#xff0c;巷道两侧的货架上存放着需要拣取的各种物品。横向有三条过道&#xff0c;不同于单区型仓库&#xff08;single-block warehouse&#xff09;的是&…

面向对象核心概念实验

第1关:面向对象核心概念编程-简单测试 本关任务: 一、请在源代码文件“Complex.java”中实现公开的复数类“Complex”,其变量(属性)是复数的实部与虚部,实部和虚部的类型都为double,访问限制为私有。同时定义以下公开方法: (1)构造方法:提供几种构造方法,包括没有…

第 8 章 项目质量管理

手工艺阶段---质量检验阶段---统计质量阶段---全面质量管理阶段&#xff08;TQM&#xff0c;全面&#xff0c;全过程&#xff0c;全员参与&#xff09; TQM又强调5Q法&#xff0c; QS&#xff1a;遵从质量管理体系&#xff0c;公司级负责 QP&#xff1a;制定质量管理计划&…

Vue中的props配置项(父组件向子组件传数据)

目录 总结 问题1&#xff1a;如果子组件Student.vue接收到数据后&#xff0c;要对数据进行操作&#xff0c;比如说&#xff1a;让显示在页面上的年龄比接收到的年龄要大&#xff0c;怎么操作&#xff1f;--> 通过 v-bind绑定属性 ,其属性值是 运行引号里面JS表达式执行的结…

Research on Micro-Expression Spotting Method Based on Optical Flow Features

Research on Micro-Expression Spotting Method Based on Optical Flow Features 哈喽&#xff0c;大家好&#xff0c;从今天开始更《菜鸡读论文》系列&#xff0c;因为我真的很菜&#xff0c;可以说是CV白的不能再白了&#xff0c;每天都在膜拜大佬&#xff0c;感觉别人和自己…

linux内存重映射的概念及对内核虚拟地址的重映射方法分析

【摘要】本文分析了Linux设备的内存映射的相关概念和理论&#xff0c;使用例子对mmap及nopage的驱动编写方法进行了解释&#xff0c;最后对3种不同的内核虚拟空间分配方法下&#xff0c;mmap驱动编写方法进行了细致的分析和调试。 1、mmap概念 如下图所示&#xff0c;mmap是操…

学习笔记276—怎么查询哪些药属于医保报销范围?

第一个方法:登陆中国医疗保险网。 点击下方的查询中的医保目录查询: 在页面中输入你想知道的药品名称即可: 意在交流学习,欢迎点赞评论🙏, 如有谬误,请联系指正。转载请注明出处。 联系方式: e-mail: heyi9069@gmail.com QQ: 3309198330(请简要说明来意,并备注“来…

Java 方法区的演进

在 JDK7 及以前&#xff0c;习惯上把方法区&#xff0c;称为永久代。JDK8开始&#xff0c;使用元空间取代了永久代。 元空间的本质和永久代类似&#xff0c;都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于&#xff1a;元空间不在虚拟机设置的内存中&#xff…

Python 中计算字符串中的元音个数

计算字符串中的元音个数&#xff1a; 将元音存储在一个字符串中。使用 dict 理解来迭代字符串。使用 str.count() 方法计算原始字符串中每个元音的出现次数。 vowels aeioumy_str www.jiyik.com# ✅ 计算字符串中每个元音出现的次数 vowels_count {vowel: my_str.lower().…

计算机专业研究生核心能力培养(4)——实验的流程及规范

0. 前言 今天我们讲一讲实验的流程和规范,主要包括以下7个部分: 目的清晰代码规范实验可拓展结果可比较结果可复现分析实验(常规)分析实验(有针对性)1. 目的清晰 当我们进行一个课题进行研究的时候,最重要的是要目的清晰,也就是说我们为什么要进行这个研究。做实验的…

使用cpolar建立固定的SSH隧道

一直以来&#xff0c;不同的操作系统都在相互竞争&#xff0c;而竞争的结果&#xff0c;就每种操作系统都占领了自己的一片天地。虽然现在的家用电脑大多使用Windows操作系统&#xff0c;但服务器领域大多使用占用资源更少的Linux系统&#xff0c;更不用说苹果电脑专属的iOS操作…

Cell:女性痴呆风险是男性的2倍,与基因相关,或是与生俱来的

医林研究院&#xff0c;让医学更简单 阿尔茨海默症&#xff08;AD&#xff09;&#xff0c;俗称老年痴呆症&#xff0c;是一个具有高经济和社会负担的全球健康问题。全球约有5000万痴呆症病例&#xff0c;每年新增约有1000万例&#xff0c;在中国&#xff0c;有上千万患者&…

Github每日精选(第52期):验证您的有风险的shell命令shellfirm

shellfirm shellfirm 是一个shell的拦截器&#xff0c;拦截任何有风险的shell命令&#xff08;默认或由您定义&#xff09;并提示您进行双重验证。 我如何从自己身上拯救自己&#xff1f; rm -rf *git reset --hard在按下回车键之前&#xff1f;kubectl delete ns停止&#…

【干货】10个高质量的java自学网站推荐

经常有人留言问我&#xff0c;“想学习Java编程&#xff0c;有没有学习资源推荐&#xff0c;有哪些网站可以关注”。好些同学是去网盘搜索&#xff0c;或者去某宝购买&#xff0c;搜集一堆资料&#xff0c;但是又不清楚哪些是重复的内容&#xff0c;哪些内容是不是版本已经过时…

【Bluetooth|蓝牙开发】十一、一文秒懂 | 超详细的Bluez交叉编译

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;【 所有文章汇总】 1、 前言 前面几篇文章&#xff0c;主要讲解了蓝牙协议栈层面的内容&#xff0c;本篇来从源…