关于此题[ABC367E] Permute K times倍增思想的一些总结
传送门
第一次接触到倍增思想是用来求lca时,为了避免一层一层往上爬浪费时间复杂度。再后来就是区间DP中一小类问题或者是部分图上问题可以用倍增来优化。
那么这道题其实可以看作图上问题来使用倍增优化。看到这道题的数据范围,K达到了
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long t;
const long long N = 2e5 + 10;
long long n,k;
long long x[N],a[N];
long long f[N][65];
void solve() {
cin >> n >> k;
for(long long i = 1;i <= n;i++) {
cin >> x[i];
f[i][0] = x[i];
}
for(long long i = 1;i <= n;i++) cin >> a[i];
for(long long i = 1;i <= 64;i++)
for(long long j = 1;j <= n;j++)
f[j][i] = f[f[j][i-1]][i-1];
for(long long i = 1;i <= n;i++) {
long long u = i;
for(int j = 0;j <= 62;j++) {
long long t = pow(2,j);
if((k & t) != 0) u = f[u][j];
}
cout << a[u] << ' ';
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
t = 1;
while(t--) solve();
return 0;
}
值得注意的是,由于
分类:
做题总结