Submission #1309086

#TimeUsernameProblemLanguageResultExecution timeMemory
1309086yusifmExam (eJOI20_exam)C++20
0 / 100
1 ms576 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define ll long long
#define str string
#define pb push_back
#define pf push_front
#define in insert
#define all(v) v.begin(),v.end()
const int sz=1000000,INF=10000000;
using namespace std;
ll n,m,num,cnt;
vector<ll>res,res1,res2,Res;
map<vector<ll>,pair<pair<ll,ll>,vector<ll>>>parent;
bool f(vector<ll>nums,ll num)
{
    for(int i=0;i<nums.size()-1;i++)
    {
        if((num==1 && nums[i]>=nums[i+1]) || (num==2 && nums[i]>nums[i+1]))
        {
            return false;
        }
    }
    return true;
}
vector<ll>F(ll num1,ll num2,vector<ll>nums)
{
    vector<ll>res;
    for(int i=0;i<nums.size();i++)
    {
        if(i==num1)
        {
            res.pb(nums[num1]^nums[num2]);
        }
        else
        {
            res.pb(nums[i]);
        }
    }
    return res;
}
void bfs(vector<ll>nums,ll num)
{
    queue<vector<ll>>numS;
    numS.push(nums);
    parent[nums]={{-1,-1},{}};
    while(numS.size()!=0 && cnt<INF)
    {
        res=numS.front();
        numS.pop();
        if(f(res,num))
        {
            Res=res;
            break;
        }
        else
        {
            for(int i=0;i<res.size();i++)
            {
                if(i==0)
                {
                    res1=F(i,i+1,res);
                    if(parent.find(res1)==parent.end())
                    {
                        numS.push(res1),parent[res1]={{i+1,i+2},res};
                        cnt++;
                    }
                }
                else if(i==res.size()-1)
                {
                    res2=F(i,i-1,res);
                    if(parent.find(res2)==parent.end())
                    {
                        numS.push(res2),parent[res2]={{i,i+1},res};
                        cnt++;
                    }
                }
                else
                {
                    res1=F(i,i+1,res),res2=F(i,i-1,res);
                    if(parent.find(res1)==parent.end())
                    {
                        numS.push(res1);
                        parent[res1]={{i+1,i+2},res};
                        cnt++;
                    }
                    if(parent.find(res2)==parent.end())
                    {
                        numS.push(res2);
                        parent[res2]={{i,i+1},res};
                        cnt++;
                    }
                }
            }
        }
    }
}
void solve()
{
    cin>>n>>m;
    vector<ll>nums;
    vector<pair<ll,ll>>ans;
    for(int i=0;i<n;i++)
    {
        cin>>num;
        nums.pb(num);
    }
    if(!is_sorted(all(nums)))
    {
        bfs(nums,m);
        while(parent[Res].first!=make_pair(-1LL,-1LL))
        {
            ans.pb(parent[Res].first),Res=parent[Res].second;
        }
        reverse(all(ans));
    }
    cout<<ans.size()<<"\n";
    for(int i=0;i<ans.size();i++)
    {
        cout<<ans[i].first<<" "<<ans[i].second<<"\n";
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    ll t=1;
    //cin>>t;
    while(t--)
    {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...