P6148 [USACO20FEB] Swapity Swapity Swap S
P6148 [USACO20FEB] Swapity Swapity Swap S
Farmer John 的
Farmer John 想到了一个新的奶牛晨练方案。他给奶牛们
对于从
- 当前从左往右数在位置
的奶牛序列反转她们的顺序。 - 当奶牛们重复这一过程
次后,请对每一个 输出从左往右数第 头奶牛的编号。
思路1:
首先看暴力,暴力
首先我们可以自然而然的想到用矩阵代表每一次变换(即代表一次
初始答案矩阵:
那么对于一次交换
其中
其中副斜对角线上的的值全为
转移矩阵表示的是其他元素不变,
那么我们只需要对
但是我们发现
我们发现,转移矩阵的每一行,每一列都只对应着一个
则我们可以把这个矩阵压缩成
第
那么我们转移矩阵的相乘就可以变成: (其中
矩阵的自乘就会变为:
这样看就很简单了,我们定义 MATRIX
结构体,在里面重载运算符实现
#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
我们发现,对于一次反转后,每个位置上对应的数是独一无二的.
我们发现这跟函数的定义很像,即定义域上的每一个值都对应了唯一的一个值.
对于每
其中
我们用
然后用倍增的思想来处理
代码与上面非常的相似.
本文来自博客园,作者:wyl123ly,转载请注明原文链接:https://www.cnblogs.com/wyl123ly/p/18464752
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2023-10-14 string用法合集