NC232383. 交换
描述
输入描述
第一行输入两个数字 分别代表小沙的指令集长度,以及管理员大大下发的任务数随后行 每行两个数字,代表交换位置的数字随后行 每行第一个数代表这段数列有个数,保证给定 数是一段排列。
输出描述
对于每个任务输出一行整数代表答案如果没法完成任务输出-1
示例1
输入:
3 3 1 3 1 2 2 3 3 3 2 1 3 2 1 3 3 3 1 2
输出:
1 1 2
C++ 解法, 执行用时: 1827ms, 内存消耗: 103420K, 提交时间: 2022-03-05 15:57:58
#include<bits/stdc++.h> using namespace std; const int N=2e3+9; int n,m,k; int x[N],y[N]; unordered_map<string,int>mp; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) cin>>x[i]>>y[i],x[i]--,y[i]--; string s="0123456789"; string t=""; for(int i=0;i<10;i++) t+=s[i],mp[t]=0; for(int i=1;i<=n;i++) { s="0123456789"; for(int j=i;j>=1;j--) { swap(s[x[j]],s[y[j]]); t=""; int maxn=-1; for(int l=0;l<10;l++) { t+=s[l]; maxn=max(maxn,s[l]-'0'); if(maxn>l) continue; if(!mp.count(t)) mp[t]=i-j+1; else mp[t]=min(mp[t],i-j+1); } } } while(m--) { cin>>k; s=""; for(int i=1,a;i<=k;i++) { cin>>a; a--; s+=(char)(a+'0'); } if(!mp.count(s)) cout<<"-1\n"; else cout<<mp[s]<<"\n"; } return 0; }