# 牛客IOI周赛18-提高组 A 排列（置换，倍增）

5 2 2
1 4
2 3

1 2 3 4 5

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <iostream>
#include <vector>

using namespace std;

typedef unsigned long long ull;
const ull mod = 131;
const int maxn = 1e5 + 7;

int p[maxn],fa[maxn],cnt[maxn],vis[maxn];
pair<int,int>a[maxn];
vector<int>G[maxn]; //环中节点

int findset(int x) {
if(fa[x] == x) return x;
return fa[x] = findset(fa[x]);
}

void Union(int x,int y) {
int rx = findset(x),ry = findset(y);
if(rx != ry) {
fa[rx] = ry;
}
}

int main() {
int n,m,k;scanf("%d%d%d",&n,&m,&k);
for(int i = 1;i <= n;i++) {
fa[i] = p[i] = i;
}
for(int i = 1;i <= m;i++) {
scanf("%d%d",&a[i].first,&a[i].second);
reverse(p + a[i].first,p + a[i].second + 1);
}
for(int i = 1;i <= n;i++) {
Union(i,p[i]);
}
for(int i = 1;i <= n;i++) {
cnt[findset(i)]++;
}
for(int i = 1;i <= n;i++) {
if(!cnt[i]) continue;
int now = i;
for(int j = 0;j < cnt[i];j++) {
vis[now] = j; //now在环中下标
G[i].push_back(now);
now = p[now];
}
}
for(int i = 1;i <= n;i++) { //每个数映射成了什么
int num = findset(i);
int pos = vis[i];
int len = cnt[num];
p[i] = G[num][(pos + k) % len];
}
for(int i = 1;i <= n;i++) {
printf("%d ",p[i]);
}
return 0;
}



#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <cmath>
using namespace std;

typedef long long ll;
const int maxn = 1e5 + 7;
const int mod = 1e9 + 7;

int to[maxn],f[maxn][33];

int main() {
int n,m,k;scanf("%d%d%d",&n,&m,&k);
for(int i = 1;i <= n;i++) to[i] = i;
for(int i = 1;i <= m;i++) {
int x,y;scanf("%d%d",&x,&y);
reverse(to + x,to + 1 + y);
}
for(int i = 1;i <= n;i++) f[i][0] = to[i];

for(int j = 1;j <= 30;j++) {
for(int i = 1;i <= n;i++) {
f[i][j] = f[f[i][j - 1]][j - 1];
}
}

for(int i = 1;i <= n;i++) {
int now = i;
for(int j = 30;j >= 0;j--) {
if(k & (1 << j)) {
now = f[now][j];
}
}
printf("%d ",now);
}
return 0;
}


• 点赞
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏
• 手机看

分享到微信朋友圈

x

扫一扫，手机阅读

• 打赏

打赏

tomjobs

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文

04-04 96
09-04 95
03-09 66
05-24 77