首页 > 其他分享 >P7981 [JRKSJ R3] system

P7981 [JRKSJ R3] system

时间:2024-04-20 11:22:21浏览次数:30  
标签:P7981 log int system i64 JRKSJ 节点 define

P7981 [JRKSJ R3] system

建图

看到这题,容易想到 \(i\rightarrow a_i\),那么这个过程实际上形成了基环树森林。接下来分析操作在图上的变化。

我们以环上的每个节点作为根,手玩之后就可以发现,经过 \(k\) 次操作后,每个节点的值就是 \(2^k\) 级父亲(包括自己)。虽然这样不够严谨,因为跳完之后会在环上绕圈。由于每棵树的深度 \(\le \log n\),我们可以先做 \(\log n\) 次操作,操作后的图中树的深度就变成 \(0\) 和 \(1\) 了。

对于环上的节点,还需要跳 \(2^{k-\log n}\) 次,假设环长为 \(l\),那么最后位置就是 \(2^{k-\log n}\bmod l\),显然只需要确定一个起点,接下来的点都是一一对应的,顺下去更新 \(ans\),就可以,复杂度 \(O(n)\)。

深度为 \(0\) 没有儿子,不用管;深度为 \(1\) 的节点,由于比 \(a_i\) 少跳一次,最后的位置就是 \(pre_{ans_{a_i}}\),\(pre\) 在遍历环时就可以更新。

复杂度 \(O(n\log k)\)。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_back

typedef long long i64;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 5e5 + 10;
i64 n, k;
i64 a[N], b[N], vis[N], bel[N], pre[N], ans[N];
void work() {
	for(int i = 1; i <= n; i++) b[i] = a[a[i]];
	for(int i = 1; i <= n; i++) a[i] = b[i];
	return;
}
i64 qpow(i64 a, i64 b, i64 m) {
	i64 ret = 1;
	while(b) {
		if(b & 1) ret = ret * a % m;
		a = a * a % m;
		b >>= 1;
	}
	return ret;
}
void Solve() {
	std::cin >> n >> k;

	for(int i = 1; i <= n; i++) {
		std::cin >> a[i];
	}
	i64 lg = log2(n) - 1;
	while(lg && k) {
		lg--, k--;
		work();
	}
	if(!k) {
		for(int i = 1; i <= n; i++) std::cout << a[i] << " \n"[i == n];
		return;
	}
	for(int i = 1; i <= n; i++) {
		if(vis[i]) continue;

		i64 now = i;
		for(; !vis[now]; now = a[now]) vis[now] = 1;
		if(bel[now]) continue;

		i64 cnt = 0;
		for(; !bel[now]; now = a[now]) bel[now] = 1, cnt++, pre[a[now]] = now;

		i64 t = qpow(2, k, cnt), st = now, ed = now;
		while(t--) ed = a[ed];

		ans[st] = ed;
		now = a[st], ed = a[ed];
		while(now != st) {
			ans[now] = ed;
			now = a[now], ed = a[ed];
		}
	}
	for(int i = 1; i <= n; i++) {
		if(!bel[i]) ans[i] = pre[ans[a[i]]];
	}
	for(int i = 1; i <= n; i++) std::cout << ans[i] << " \n"[i == n];
}
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	Solve();

	return 0;
}

标签:P7981,log,int,system,i64,JRKSJ,节点,define
From: https://www.cnblogs.com/FireRaku/p/18147496

相关文章

  • MIT6.S081 - Lecture3: OS Organization and System Calls
    为什么要使用操作系统使用操作系统的主要原因是为了实现CPU多进程分时复用以及内存隔离如果没有操作系统,应用程序会直接与硬件进行交互,这时应用程序会直接使用CPU,比如假设只有一个CPU核,一个应用程序在这个CPU核上运行,但是同时其他程序也需要运行,因为没有操作系统来帮助......
  • 错误:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题
    最近在虚拟机上搭一套新的开发环境,运行项目时报错。如果你的系统中已经安装了Oracle客户端软件,那么可能需要检查一些环境变量。例如,你可以通过在系统的环境变量中设置PATH变量来包含Oracle客户端的路径,这样可以帮助.NET框架找到所需的Oracle客户端软件。此外,如果你的Oracle客户......
  • SystemVerilog -- 6.2 Interface Bundles
    Introduction涵盖了对接口的需求,如何实例化接口并将其与设计连接起来。设计有两种编写方式:通过使用现有接口名称专门使用该接口通过使用可以将任何接口传递到的泛型接口句柄显然,当接口定义更新到具有不同名称的较新版本时,泛型方法效果最佳,并且需要支持使用它的旧设计。Examp......
  • systemctl 命令和参数
     systemctl命令和参数命令格式systemctl命令服务名称例如systemctlstartphp.serviceCopy命令1start开启2stop关闭3restart重启4status查看状态5is-active查看激活与......
  • deepspeed 训练多机多卡报错 ncclSystemError Last error
     最近在搞分布式训练大模型,踩了两个晚上的坑今天终于爬出来了我们使用2台8*H100遇到过错误110.255.19.85:ncclSystemError:Systemcall(e.g.socket,malloc)orexternallibrarycallfailedordeviceerror.10.255.19.85:Lasterror:10.255.19.85:socketStartCo......
  • .net 6 C#中System.IO.Path类的用法
    1.说明/*PerformsoperationsonSystem.Stringinstancesthatcontainfileordirectorypathinformation.Theseoperationsareperformedinacross-platformmanner.对系统执行操作。包含文件或目录的字符串实例路径信息。这些操作是以跨平台的方式执行的。*/......
  • [CF457A]Golden System
    CF457AGoldenSystem十分精妙的一道题,斐波那契数列和黄金比例\(\Phi\)的内在有着奇妙的联系。我们设\(x=\frac{\sqrt{5}+1}{2}\),则根据题目给出的规律,有\(x^2=x+1\)。下面我们通过列举,试图找出规律:\(x^0=1\)\(x^1=x\)\(x^2=x+1\)\(x^3=2x+1\)\(x^4=3x+2\)\(x^5=5x+3\)......
  • 解决C# 连接MYSQL数据库查询数据时 Unable to convert MySQL date/time value to Syst
    C#读取MySql时,如果存在字段类型为date/datetime时的可能会出现以下问题“UnabletoconvertMySQLdate/timevaluetoSystem.DateTime”原因:可能是该字段(date/datetime)的值默认缺省值为:0000-00-00/0000-00-0000:00:00,这样的数据读出来转换成System.DateTime时就会有问题;解......
  • C:\Windows\System32\setup 目录中,这个目录包含了一些与系统安装和配置相关的文件
    C:\Windows\System32\setup目录中,这个目录包含了一些与系统安装和配置相关的文件。作用:cmmigr.dll:这是一个动态链接库文件,可能与移动设备中心相关。它可能包含了用于迁移和处理移动设备中心配置的函数和资源。comsetup.dll:这是ComponentServicesSetup工具的......
  • C:\Windows\System32\spool 目录中,这个目录是与打印相关的系统服务的默认位置。 Pr
    C:\Windows\System32\spool目录中,这个目录是与打印相关的系统服务的默认位置。作用:drivers:这个文件夹包含了打印机驱动程序文件。Windows系统使用这些驱动程序来与不同类型和品牌的打印机进行通信。PRINTERS:这个文件夹通常用于存储正在打印的文档的临时文件。当......