Найти ошибку сегментации при передаче карты в функцию C ++ - PullRequest
0 голосов
/ 10 мая 2019

Я не могу найти ошибку сегментации, которая происходит на линии, где я звоню calculate_grundy в main. Пожалуйста, помогите.

Я также добавил скриншот моего отладчика при отладке кода.

Это вопрос соревнований по бегу, поэтому, пожалуйста, не отвечайте на логические проблемы, а не помогите мне найти ошибку сегментации.

Я передаю карту dp для хранения подзадач, как в динамическом программировании.

#include<bits/stdc++.h>
#define ll long long int
using namespace std;

ll calculate_mex(unordered_set<ll> Set)
{
    ll mex = 0;
    while(Set.find(mex)!=Set.end())
    {
        mex++;
    }
    return mex;
}

ll calculate_grundy(ll n,ll m,map<pair<ll,ll>,ll> &dp)
{
    auto it = dp.find(make_pair(n,m));
    if(it!=dp.end())
    {
        return it->second;
    }
    else
    {
        ll ans;
        ll greater = max(n,m);
        ll smaller = min(n,m);
        if(n==m || m==0 || n==0)
        {
            return 0;
        }
        else if(n==1 || m==1)
        {
            return n==1?m:n;
        }
        unordered_set<ll> Set;
        ll limit = greater%smaller;
        for(ll i=1;i<=limit;i++)
        {
            ll mult = smaller*i;
            Set.insert(calculate_grundy(greater-mult,smaller,dp));
        }
        ans = calculate_mex(Set);
        dp.insert(make_pair(make_pair(n,m),ans));
        return ans;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ll t;
    cin>>t;
    while(t--)
    {
        ll n,m;
        cin>>n>>m;
        map<pair<ll,ll>,ll> dp;
        if(calculate_grundy(n,m,dp)==0)
        {
            cout<<"Ari"<<"\n";
        }
        else
        {
            cout<<"Rich"<<"\n";
        }
    }
}
* +1012 *image
...