

思路:
string x中为1的对应的必须为1,为0的可以对应1,也可以对应0,首先,p数组中最小和最大的数对应的位置变不成1,且p数组的首尾位置变不成1,所以出现这两种情况,直接输出-1即可。
如果没出现这种情况,题目中说最多操作五次,不需要最小化操作次数,那么五种正好覆盖全部位置,五种情况见代码。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
#define int long long
void solve() {
int n;cin>>n;
vector<int>p(n);
string x;
int max1=-1;int maxpos=-1;
int min1=1e9,minpos=1e9;
for(int i=0;i<n;i++)
{
cin>>p[i];
if(p[i]>max1)
{
max1=p[i];
maxpos=i;
}
if(p[i]<min1)
{
min1=p[i];
minpos=i;
}
}
cin>>x;
if(x[maxpos]=='1'||x[minpos]=='1'||x[0]=='1'||x[n-1]=='1')
{
cout<<-1<<endl;return;
}
vector<int>s;vector<pair<int,int>>q;
int n1=0;
for(int i=0;i<n;i++)
{
if(x[i]=='1')n1++;
}
if(n1==0)
{
cout<<0<<endl;return;
}
int l=min(minpos,maxpos);
int r=max(minpos,maxpos);
q.push_back({l+1,r+1});
q.push_back({1,minpos+1});
q.push_back({1,maxpos+1});
q.push_back({minpos+1,n});
q.push_back({maxpos+1,n});
cout<<5<<endl;
for(auto&op:q)
{
cout<<op.first<<" "<<op.second<<endl;
}
}
signed main() {
int t;
cin >> t;
while (t–) {
solve();
}
return 0;
}




