首页 > 其他分享 >序列(sequence)

序列(sequence)

时间:2024-08-11 15:50:04浏览次数:10  
标签:sequence int 元素 交换 次数 序列

题目链接: 序列(sequence)

csdn食用更佳:序列(sequence)

思路分析

  • 距离计算:
    定义两个序列 $a$ 和 $b$ 的距离为 $(\sum_{i=1}^{n} (a_i - b_i)^2)$。
    我们需要通过交换 $a$ 中的元素来最小化这个距离。

  • 最小化距离:
    由于 $a$ 和 $b$ 中的元素都是唯一的,我们可以通过将 $a$ 中的元素重新排列,使得 $a_i$ 尽可能接近 $b_i$。
    具体来说,我们可以将 $a$ 和 $b$ 中的元素按相同的顺序排序,这样 $a_i$ 和 $b_i$ 的对应关系就是最优的。

  • 计算最小交换次数:
    为了计算最少的交换次数,我们需要找到 $a$ 中的元素与 $b$ 中的元素之间的置换环。
    每个置换环的长度减去 $1$ 就是该环需要的交换次数。
    总的交换次数就是所有置换环的交换次数之和。


具体步骤

  • 读取输入:

    • 读取 (n) 和 (T)。
    • 读取序列 $a$ 和 $b$。
  • 计算最小距离:

    • 将 $a$ 和 $b$ 分别排序。
    • 计算排序后的 $a$ 和 $b$ 的距离。
  • 计算最小交换次数如果 $T = 1$:

    • 构建一个映射,将 $a$ 中的每个元素映射到 $b$ 中的对应位置。
    • 使用深度优先搜索(DFS)或并查集来找到所有的置换环。
    • 计算每个置换环的长度,并求出总的交换次数。

代码实现

#include <bits/stdc++.h>
using namespace std;

const int N = 6e5 + 5;
const long long MOD = 998244353;

int n, t;
pair<int, int> a[N], b[N];
int p[N];

int main()
{
    freopen("sequence.in", "r", stdin);
    freopen("sequence.out", "w", stdout);
    scanf("%d %d", &n, &t);
    for (int i = 1; i <= n; ++i) 
	{
        scanf("%d", &a[i].first);
        a[i].second = i;
    }
    for (int i = 1; i <= n; ++i) 
	{
        scanf("%d", &b[i].first);
        b[i].second = i;
    }
    sort(a + 1, a + n + 1),sort(b + 1, b + n + 1);
    long long ans = 0;
    for (int i = 1; i <= n; ++i) 
	{
        p[a[i].second] = b[i].second;  // 将序列 A 中的元素对应到序列 B 中的位置
        ans = (ans + (long long)(a[i].first - b[i].first) * (a[i].first - b[i].first)) % MOD;
    }
    long long sum = 0;
    for (int i = 1; i <= n; ++i) 
	{
        while (p[i] != i)  // 如果当前位置的对应不是自己
		{
            swap(p[i], p[p[i]]); // 交换对应关系,使其正确
            sum++;
        }
    }
    printf("%lld ", ans);
    if (t == 1) 
	{
        printf("%lld\n", sum);
    }
    return 0;
}

Alt

标签:sequence,int,元素,交换,次数,序列
From: https://www.cnblogs.com/LGY-company/p/18353498

相关文章

  • CVE-2019-12422~shiro反序列化【春秋云境靶场渗透】
    #今天我们来攻克CVE-2019-12422春秋云境这个靶场漏洞当我们知道了该靶场是shiro反序列化漏洞,所以直接用工具梭哈好小子,离成功又近一步!!!......
  • 时间序列分析
    平稳性检验时序图自相关系数图纯随机性检验方法性工具差分运算延迟算子线性差分方程AR模型......
  • Prufer序列
    Prufer序列Prufer序列可以将一个带标号\(n\)个结点的树用\([1,n]\)中的\(n-2\)个整数表示,也可以理解为完全图的生成树与数列之间的双射。建立过程:每次选择编号最小的叶子节点并删掉,然后在序列中记录它连接的节点标号,重复\(n-2\)次后结束。不难发现:构造完Pruf......
  • web渗透-反序列化
    一:概念1、序列化:将变量转化为可保存或者可以传输的字符串的过程;实现函数是serialize()函数(变量转化成字符串)2、反序列化:把这个字符串在转化成原来变量使用;就是序列化的逆过程;实现函数是unserialize()函数(字符串转换成变量)3、示例<?phpclassStudent{ public$name="admin";......
  • wechat crawler url拼接 url解析 微信爬虫 json序列化 反序列化
    WechatPublicRequest\Program.csusingSystem.Collections.Specialized;usingSystem.Diagnostics;usingSystem.Web;usingNewtonsoft.Json;classProgram{staticasyncTaskMain(){varlatestTxtFilePath=GetLatestTxtFilePath();......
  • 如何在Java项目中使用自定义序列化器处理URL
    如何在Java项目中使用自定义序列化器处理URL在Java开发中,处理和序列化URL是一个常见的需求,尤其是在涉及到图像资源时。如果项目需要根据特定条件处理图像URL(如添加前缀),可以自定义一个序列化器来简化这一过程。本文将介绍如何创建一个自定义的ImgJsonSerializer类,处理单个URL和UR......
  • 代码随想录day25 || 491 递增子序列,46 全排列, 47 全排列2
    491递增子序列funcfindSubsequences(nums[]int)[][]int{ //思路,在原数组上面找寻递增子序列,所以不能改变顺序, varpath[]int varres[][]int //nums=quicksort(nums) backtracking(nums,&path,&res,-200)//范围是【-100,100】,传入一个不在区间的数字就不会......
  • 机器学习笔记:序列到序列学习[详细解释]
    介绍本节我们使用两个循环神经网络的编码器和解码器,并将其应用于序列到序列(sequencetosequence,seq2seq)类的学习任务。遵循编码器-解码器架构的设计原则,循环神经网络编码器使用长度可变的序列作为输入,将其转换为固定形状的隐状态。换言之,输入序列的信息被编码到循环神经网......
  • 多元时间序列分析统计学基础:基本概念、VMA、VAR和VARMA
    多元时间序列是一个在大学课程中经常未被提及的话题。但是现实世界的数据通常具有多个维度,所以需要多元时间序列分析技术。在这文章我们将通过可视化和Python实现来学习多元时间序列概念。这里假设读者已经了解单变量时间序列分析。1、什么是多元时间序列?顾名思义,多元时间序列是......
  • AtCoder Regular Contest 100 F Colorful Sequences
    洛谷传送门AtCoder传送门比较有趣的一个题。考虑一个弱化版,算colorful序列个数。有一个\(O(nK)\)的dp,大概就是设\(f_{i,j}\)为考虑到第\(i\)个数,当前最长互不相同后缀长度为\(j\)。转移考虑若往后面填一个在这\(j\)个数以外的数就能使\(j\getsj+1\),因此\(......