首页 > 其他分享 >P6148 [USACO20FEB] Swapity Swapity Swap S

P6148 [USACO20FEB] Swapity Swapity Swap S

时间:2024-10-14 18:32:47浏览次数:5  
标签:... int P6148 矩阵 Swapity leq Swap bmatrix vdots

P6148 [USACO20FEB] Swapity Swapity Swap S

Farmer John 的 \(N\) 头奶牛(\(1\leq N\leq 10^5\))站成一排。对于每一个 \(1\leq i\leq N\),从左往右数第 \(i\) 头奶牛的编号为 \(i\)。

Farmer John 想到了一个新的奶牛晨练方案。他给奶牛们 \(M\) 对整数 \((L_1,R_1)\ldots (L_M,R_M)\),其中 \(1\leq M\leq 100\)。他让她们重复以下包含 \(M\) 个步骤的过程 \(K\)(\(1\leq K\leq 10^9\))次:

对于从 \(1\) 到 \(M\) 的每一个 \(i\):

  • 当前从左往右数在位置 \(L_i\ldots R_i\) 的奶牛序列反转她们的顺序。
  • 当奶牛们重复这一过程 \(K\) 次后,请对每一个 \(1\leq i\leq N\) 输出从左往右数第 \(i\) 头奶牛的编号。

思路1:

首先看暴力,暴力 \(O(nmk)\),非常的去世。

首先我们可以自然而然的想到用矩阵代表每一次变换(即代表一次\((L_i,R_i)\))的交换。

初始答案矩阵:

\[\begin{bmatrix} 1\\ 2\\ 3\\ \vdots\\ n \end{bmatrix} \]

那么对于一次交换 \((L_i,R_i)\) 的转移,我们可以构造出转移矩阵:

\[\begin{bmatrix} 1 & 0 & 0 & ... & 0 \\ 0 & 1 & 0 & ... & 0 \\ 0 & 0 & 1 & ... & 0\\ \vdots & \vdots & \vdots& ([L_i,R_i])& \vdots\\ 0 & 0 & 0 & ... & 1 \end{bmatrix} \]

其中 \([L_i,R_i]\) 的子矩阵是:

\[\begin{bmatrix} 0 & 0 & ... & 0 & 1 \\ 0 & 0 & ... & 1 & 0 \\ \vdots & \vdots & \ddots & \vdots & \vdots\\ 0 & 1 & ... & 0 & 0\\ 1 & 0 & ... & 0 & 0 \end{bmatrix} \]

其中副斜对角线上的的值全为 \(1\).

转移矩阵表示的是其他元素不变,\((L_i,R_i)\) 之间的元素全部交换.

那么我们只需要对 \(m\) 个操作的矩阵全部乘起来,然后自乘 \(k\) 次,最后在与答案矩阵相乘即可.

但是我们发现 \(n \le 1e5\),也就是说我们的转移矩阵的大小要是 \(1e5 \times 1e5\) 的大小,不 \(TLE\) 也得 \(MLE\).

我们发现,转移矩阵的每一行,每一列都只对应着一个 \(1\).

则我们可以把这个矩阵压缩成 \(1 \times 1e5\) 的矩阵:

\[\begin{bmatrix} 1\\ 2\\ 3\\ \vdots\\ \overbrace{R_i}\\ R_i - 1\\ \vdots\\ L_i + 1\\ \underbrace{L_i}\\ R_i + 1\\ \vdots\\ n \end{bmatrix} \]

第 \(i\) 行的元素代表了原转移矩阵第 \(i\) 行中的 \(1\) 在第几列.

那么我们转移矩阵的相乘就可以变成: (其中 \(ans\) 是答案矩阵,\(a,b\) 是转移矩阵.)

\[a \times b:\\ ans_i = b_{a_i} \]

矩阵的自乘就会变为:

\[a^2 :\\ ans_i = a_{a_i} \]

这样看就很简单了,我们定义 MATRIX 结构体,在里面重载运算符实现 \('\times'\) 运算即可.

\(code:\)

#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1e5 + 7;
const int MAXM = 105;
int n,m,k;
struct OPERATE{
	int l,r;
}op[MAXM];
struct MATRIX{
	int a[MAXN];
	void init(){ for(int i = 1;i <= n;i++) a[i] = i; }
	MATRIX operator*(const MATRIX &other){
		MATRIX ans;
		int res[MAXN];
		for(int i = 1;i <= n;i++) res[i] = other.a[i];
		for(int i = 1;i <= n;i++) ans.a[i] = res[a[i]];
		return ans;
	}
	void print_ans(){ for(int i = 1;i <= n;i++) cout << a[i] << endl; }
}op_matrix[MAXM];
MATRIX anss;
MATRIX qpow(MATRIX a,int x){
	MATRIX res;
	res.init();
	while(x){
		if(x & 1) res = a * res;
		a = a * a;
		x >>= 1;
	}	
	return res;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m >> k;
	for(int i = 1;i <= m;i++){
		cin >> op[i].l >> op[i].r;
		for(int j = op[i].l;j <= op[i].r;j++) op_matrix[i].a[op[i].r - (j - op[i].l)] = j;
		for(int j = 1;j <= n;j++) if(op_matrix[i].a[j] == 0) op_matrix[i].a[j] = j;
	}
	anss.init();
	for(int i = 1;i <= m;i++) anss = op_matrix[i] * anss;
	anss = qpow(anss,k);
	anss.print_ans();
	return 0;
}

思路2

我们发现,对于一次反转后,每个位置上对应的数是独一无二的.

我们发现这跟函数的定义很像,即定义域上的每一个值都对应了唯一的一个值.

对于每 \(i\) 次操作,我们设为 \(f_i\) 为一次映射,则对于一次操作序列的映射效果 \(g\),我们有:

\[g(E) = f_1(f_2(...f_m(E))) \]

其中 \(E\) 表示初始状态.

我们用 \([1,2,...,(R_i,R_i - 1,...,L_i),R_i + 1,...,n]\) 来表示一次操作序列中的一次操作,那么我们只需要把这 \(m\) 个映射合在一起即可.

然后用倍增的思想来处理 \(k\) 次操作序列.

代码与上面非常的相似.

标签:...,int,P6148,矩阵,Swapity,leq,Swap,bmatrix,vdots
From: https://www.cnblogs.com/wyl123ly/p/18464752

相关文章

  • 【SWAP作物生长模型】数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯
    查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用目录专题一:SWAP模型介绍及数据要求专题二:数据制备与模型运行专题三:基于R模型敏感性分析与贝叶斯优化专题四:基于Fortran源代码分析专题五:气候数据降尺度与变化影响分析专题六:AI大语言模型在......
  • 智慧农业模型一一详解:DSSAT、APSIM、DNDC模型、WOFOST与PCSE、AquaCrop农水、SWAP、作
    目录全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践技术应用AquaCrop模型农业水资源管理及代码解析WOFOST模型与PCSE模型实践技术应用基于R语言APSIM......
  • SWAP农业模型数据制备、敏感性分析及气候变化影响
    SWAP模型的各个组成部分,包括气象、土壤、作物和管理措施等数据的准备和输入。通过模型的实践操作和结果分析,让参与者能够不仅理解模型背后的科学原理,同时掌握如何在实际工作中应用模型来解决问题。此外,还将深入探讨如何通过修改模型代码来定制和优化模型,以适应特定的研究需求或......
  • leetcode24 两两交换链表中的节点(swap-nodes-in-pairs)
    题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] 提示:链表中节点的数......
  • P4778 Counting Swaps
    题意:给定一个\(1\simn\)的排列\(a\)。每次可以选两个位置\(i,j\),耗费\(1\)的代价交换\(a_i,a_j\)。问使得\(a\)升序排列的最小代价是多少,以及方案数。\(1\len\le10^5\)。求最小代价:连边\(i\rightarrowa_i\),得到若干个环。一个大小为\(x\)的环需要\(x-1\)次操作......
  • swap分区扩展
    1.查看当前swap分区情况 2.使用dd创建一个4g大小的swap文件 3.将这个swap文件变成swap分区格式 4.启动交换分区,建议将swap文件权限设置为0600 5.检验 6.配置持久化,编辑/etc/fstab文件/home/swapswapswapdefaults00附删除分区步骤:1.swapoff /home/sw......
  • 题解:P9951 [USACO20FEB] Swapity Swap B
    奶牛的排列经过\(x\)次后会回到原来的位置,理解以下:\([a_1,a_2]\)的牛翻转两次就会回到原来的位置,\([b_1,b_2]\)的牛翻转两次也会回到原来的位置,所以原来奶牛的排列经过一定次数的旋转后一定会回到原来位置。我们只要先模拟得出多少次后第\(i\)位的奶牛会回到原来的位置,然后......
  • openEuler22.03关闭交换分区swap失败处理
    在架设很多上层应用系统时会遇到很多需要关闭swap的操作,例如安装Kubernetes节点。通常的做法是在/etc/fstab文件中注销swap分区的挂载,但是没有起作用,运行free-h还是能看见挂载的swap,而通过命令sudoswapoff-a&&sudosystemctlrestartkubelet.service是能够关闭并成功启......
  • Linux 分区扩容(根分区扩容,SWAP 分区扩容,挂载新分区为目录)
    Linux分区扩容(根分区扩容,SWAP分区扩容,挂载新分区为目录)-sysin|SYStemINside|软件与技术分享请访问原文链接:Linux分区扩容(根分区扩容,SWAP分区扩容,挂载新分区为目录),查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgLinux系统在运行过程中,出现磁盘空间不足,需......
  • SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与
    查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模......