cf 153.div2 D. Playing with Permutations
比賽的時候一直沒看懂題,後來看了下,其實很簡單,就是給你一個變換序列q ,有兩種變換1和2,1就是令Pi=Pqi,2則相反,互為逆變換,所以隻要單獨求出每種變換要多少少次,即可判斷出來能否成功變換。
/* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <map> #define INF 1E9 using namespace std; int q[100]; string aim=""; char p[105]; int i,n; string c1(string s) { for(i=0;i<n;i++) p[i]=s[q[i]]; return p; } string c2(string s) { for(i=0;i<n;i++) p[q[i]]=s[i]; return p; } string now="",nn; int k1,k2; int main() { int k,t,lvl; scanf("%d%d",&n,&k); for(i=0;i<n;i++) { scanf("%d",&q[i]); q[i]--; } for(i=0;i<n;i++) { scanf("%d",&t); aim.push_back(t); now.push_back(i+1); } nn=now; for(k1=0;k1<=k&&now!=aim;now=c1(now),k1++); for(k2=0;k2<=k&&nn!=aim;nn=c2(nn),k2++); if((k-k2)%2&&(k-k1)%2||(k>1&&k1==1&&k2==1)||!k1)cout<<"NO"<<endl; else cout<<"YES"<<endl; }
最後更新:2017-04-02 00:06:51